iOS 面试题整理(题加答案)
2015-04-07 16:13
225 查看
公司说要招个新人,让我弄份面试题及答案。就简简单单弄了这样一份面试题,如若有不足之处,欢迎指点指点
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
2. #import 跟#include又什么区别,@class呢,#import<>跟
#import””又什么区别?
答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma
once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。
3. 属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那种情况下用?
1. readwrite 是可读可写特性;需要生成getter方法和setter方法时
2. readonly 是只读特性
只会生成getter方法
不会生成setter方法 ;不希望属性在类外改变
3. assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
4. retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
5. copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
6. nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic
4. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:
5. 推送的原理
1、首先是应用程序注册消息推送(获取deviceToken)。
2、应用程序将deviceToken发送给苹果APNS。
3、苹果APNS向服务端(应用程序的服务器端)发送应用程序的deviceToken。
4、应用程序的服务器端将推送的消息发和deviceToken打包发给APNS。
5、APNS将消息发给应用程序。
6. 写一个单例
在iOS中,单例有两种实现方式。根据线程安全的实现来区分,一种是使用@synchronized,另一种是使用GCD的dispatch_once函数。
要实现单例,首先需要一个static的指向类本身的对象,其次需要一个初始化类函数。下面是两种实现的代码。
1、@synchronized
static InstanceClass *instance;
+ (InstanceClass *)defaultInstance{
@synchronized (self){
if (instance == nil) {
instance = [[InstanceClass alloc] init];
}
}
return instance;}
2、GCD
static InstanceClass *instance;
+ (InstanceClass *)defaultInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[InstanceClass alloc] init];
});
return instance;}
7. 写一个代理
四要素(1.声明代理方法,2.本类中含有该代理指针,3.代理指针调用该代理方法,4.需要传值的类实现代理方法)
第一步:@protocol
EveryFrameDelegate <NSObject>
- (void)DoSomethingEveryFrame;
@end(//使用@protocol声明代理方法)
第二步:@interface
GifView : UIView
{
NSTimer *timer;
id <EveryFrameDelegate>delegate;
NSInteger currentIndex;
}
@property (nonatomic, retain)id <EveryFrameDelegate>delegate;(这个一定要有,代理指针)
@end
第三步:
-(void)play
{
[delegate DoSomethingEveryFrame];(代理指针调用代理方法)
}
第四步:
- (void)DoSomethingEveryFrame(在另一个类中实现代理方法)
{
NSLog(@"I'm the delegate! I'm doing printing!");
}
8. 写一个通知,并实现数据传递
- (IBAction)buttonClick:(id)sender {
//添加
字典,将label的值通过key值设置传递
NSDictionary *dict =[[NSDictionary alloc]
initWithObjectsAndKeys:self.textFieldOne.text,@"textOne",self.textFieldTwo.text,@"textTwo",nil];
//创建通知
NSNotification *notification =[NSNotification notificationWithName:@"tongzhi" object:nil userInfo:dict];
//通过通知中心发送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
[self.navigationControllerpopViewControllerAnimated:YES];
}
在发送通知后,在所要接收的控制器中注册通知监听者,将通知发送的信息接收
- (void)viewDidLoad {
[super viewDidLoad];
//注册通知
[[NSNotificationCenterdefaultCenter]
addObserver:selfselector:@selector(tongzhi:)name:@"tongzhi"object:nil];
}
- (void)tongzhi:(NSNotification *)text{
NSLog(@"%@",text.userInfo[@"textOne"]);
NSLog(@"-----接收到通知------");
}
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
2. #import 跟#include又什么区别,@class呢,#import<>跟
#import””又什么区别?
答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma
once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。
3. 属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那种情况下用?
1. readwrite 是可读可写特性;需要生成getter方法和setter方法时
2. readonly 是只读特性
只会生成getter方法
不会生成setter方法 ;不希望属性在类外改变
3. assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
4. retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
5. copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
6. nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic
4. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:
5. 推送的原理
1、首先是应用程序注册消息推送(获取deviceToken)。
2、应用程序将deviceToken发送给苹果APNS。
3、苹果APNS向服务端(应用程序的服务器端)发送应用程序的deviceToken。
4、应用程序的服务器端将推送的消息发和deviceToken打包发给APNS。
5、APNS将消息发给应用程序。
6. 写一个单例
在iOS中,单例有两种实现方式。根据线程安全的实现来区分,一种是使用@synchronized,另一种是使用GCD的dispatch_once函数。
要实现单例,首先需要一个static的指向类本身的对象,其次需要一个初始化类函数。下面是两种实现的代码。
1、@synchronized
static InstanceClass *instance;
+ (InstanceClass *)defaultInstance{
@synchronized (self){
if (instance == nil) {
instance = [[InstanceClass alloc] init];
}
}
return instance;}
2、GCD
static InstanceClass *instance;
+ (InstanceClass *)defaultInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[InstanceClass alloc] init];
});
return instance;}
7. 写一个代理
四要素(1.声明代理方法,2.本类中含有该代理指针,3.代理指针调用该代理方法,4.需要传值的类实现代理方法)
第一步:@protocol
EveryFrameDelegate <NSObject>
- (void)DoSomethingEveryFrame;
@end(//使用@protocol声明代理方法)
第二步:@interface
GifView : UIView
{
NSTimer *timer;
id <EveryFrameDelegate>delegate;
NSInteger currentIndex;
}
@property (nonatomic, retain)id <EveryFrameDelegate>delegate;(这个一定要有,代理指针)
@end
第三步:
-(void)play
{
[delegate DoSomethingEveryFrame];(代理指针调用代理方法)
}
第四步:
- (void)DoSomethingEveryFrame(在另一个类中实现代理方法)
{
NSLog(@"I'm the delegate! I'm doing printing!");
}
8. 写一个通知,并实现数据传递
- (IBAction)buttonClick:(id)sender {
//添加
字典,将label的值通过key值设置传递
NSDictionary *dict =[[NSDictionary alloc]
initWithObjectsAndKeys:self.textFieldOne.text,@"textOne",self.textFieldTwo.text,@"textTwo",nil];
//创建通知
NSNotification *notification =[NSNotification notificationWithName:@"tongzhi" object:nil userInfo:dict];
//通过通知中心发送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
[self.navigationControllerpopViewControllerAnimated:YES];
}
在发送通知后,在所要接收的控制器中注册通知监听者,将通知发送的信息接收
- (void)viewDidLoad {
[super viewDidLoad];
//注册通知
[[NSNotificationCenterdefaultCenter]
addObserver:selfselector:@selector(tongzhi:)name:@"tongzhi"object:nil];
}
- (void)tongzhi:(NSNotification *)text{
NSLog(@"%@",text.userInfo[@"textOne"]);
NSLog(@"-----接收到通知------");
}
相关文章推荐
- 整理 《招聘一个靠谱的iOS》面试题部分参考答案
- iOS面试题总结整理(附答案)
- 盘点2016年iOS开发面试题及答案整理
- iOS 面试题整理(带答案)二
- 2018年1月iOS招人心得(附面试题)- 答案整理
- 常见的IOS面试题整理(附答案)待更新
- [iOS] 面试题整理(带答案) 二
- iOS面试题总结整理(附答案)
- iOS面试题整理带答案
- 2016年iOS开发面试题及答案整理
- iOS面试题整理带答案
- 盘点2016年iOS开发面试题及答案整理
- iOS面试题整理带答案
- [iOS] 面试题整理(带答案) 一
- 黑马程序员——iOS面试题归类整理(附详细答案)——黑马 ios 技术博客
- Oracle面试题及答案整理
- 很全面的ios面试题以及解答,很多答案不一定全对,网上摘录以及自己的理解
- ios面试题收集一(附基本答案)
- Oracle面试题及答案整理
- 史上最全的iOS面试题及答案