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

公司说要招个新人,让我弄份面试题及答案。就简简单单弄了这样一份面试题,如若有不足之处,欢迎指点指点



1. Objectc的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

2. #import #include又什么区别,@class,import<> #import””又什么区别?

答:#importObjective-C导入头文件的关键字,#includeC/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创建、使用GCDdispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

5. 推送的原理

1、首先是应用程序注册消息推送(获取deviceToken)。 

2、应用程序将deviceToken发送给苹果APNS

3、苹果APNS向服务端(应用程序的服务器端)发送应用程序的deviceToken

4、应用程序的服务器端将推送的消息发和deviceToken打包发给APNS

5、APNS将消息发给应用程序。

6. 写一个单例

iOS中,单例有两种实现方式。根据线程安全的实现来区分,一种是使用@synchronized,另一种是使用GCDdispatch_once函数。

要实现单例,首先需要一个static的指向类本身的对象,其次需要一个初始化类函数。下面是两种实现的代码。

1@synchronized

static InstanceClass *instance;

+ (InstanceClass *)defaultInstance{

    @synchronized (self){

        if (instance == nil) {

            instance = [[InstanceClass alloc] init];

        }

    }

    

    return instance;}

2GCD

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

 

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值