您的位置:首页 > 职场人生

iOS 面试题整理(题加答案)

2015-04-07 16:13 225 查看
公司说要招个新人,让我弄份面试题及答案。就简简单单弄了这样一份面试题,如若有不足之处,欢迎指点指点

1. Objectc的类可以多重继承么?可以实现多个接口么?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. 属性readwritereadonlyassignretaincopynonatomic各是什么作用,在那种情况下用?

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(@"-----接收到通知------");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: