iOS面试总结


为什么在主线程更新UI?

主要原因还是为了线程的安全,但是UIkit的线程不是安全的,假如在两个线程中设置同一张背景图片的话,这个图片当被释放的时候就会被释放两次,当前这个线程设置图片地址会把上一个线程赋值的图片地址给覆盖,因为他们设置的是同一个地址,这样就会出现野指针错误,会发生程序崩溃。虽然apple对大部分的绘图方法改成线程安全可用,但是官方还是建议我们在主线程进行UI更新,这样就会保证线程安全。

分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

类别:在没有原类.m文件的基础上,给该类添加方法;

延展:一种特殊形式的类别,主要在一个类的.m文件里声明和实现。延展的作用就是给某个类添加私有方法和私有变量。

两个的区别:

    * 延展可以添加属性并且它添加的方法是必须要实现的。延展可以认为是一个私有的类目。

    * 类别可以在不知道不改变原来代码的情况下往里面添加新的方法,只能添加不能修改和删除。

    * 并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

    * 继承可以增加,修改删除方法,添加属性。

Category只能为对象添加方法,却不能添加成员变量的原因:如果可以添加成员变量,添加的成员变量没有办法初始化。

nil、Nil、NULL和NSNull区别

NULL是宏,是对于C语言指针而使用的,表示空指针

nil是宏,是对于Objective-C中的对象而使用的,表示对象为空

Nil是宏,是对于Objective-C中的类而使用的,表示类指向空

NSNull是类类型,是用于表示空的占位对象

什么情况使用weak关键字,相比assign有什么不同?

在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,如delegate属性。自身已经对它进行一次强引用,没有必要再强引用一次,此时也会用weak,自定义IBOutlet控件属性一般也使用weak

weak此特质表明该属性定义了一种“非拥有关系”。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空。而assign的“设置方法”只会执行针对“纯量类型”的简单赋值操作。assign可以用非OC对象,而weak必须用于OC对象


一个NSObject对象占用多少内存?

一个指针变量所占用的大小(64bit占8个字节,32bit占4个字节)。

对象的isa指针指向哪里?

instance对象的isa指针指向class对象,class对象的isa指针指向meta-class对象,meta-class的isa指针指向基类的meta-class对象,基类自己的isa指针也指向自己。

OC的类信息存放在哪里?

成员变量的具体值存放在instance对象。对象方法,协议,属性,成员变量信息存放在class对象。类方法信息存放在meta-class对象。



Push Notification是如何工作的

推送通知分为两种,一个是本地推送,一个是远程推送

本地推送:不需要联网也可以推送,是开发人员在APP内设定特定的时间来提醒用户干什么

远程推送:需要联网,用户的设备会与苹果服务器形成一个长链接,用户设备会发送uuid和Bundle identifier给苹果服务器,苹果服务器会加密生成一个deviceToken给用户设备,然后设备会将deviceToken发送给APP的服务器,服务器会将deviceToken存进他们的数据库,这时候如果有人发送消息给我,服务器端就会去查询我的deviceToken,然后将deviceToken和要发送的信息发送给苹果服务器,苹果服务器通过deviceToken找到我的设备并将消息推送到我的设备上。这里还有个情况是如果APP在线,那么APP服务器会与APP产生一个长链接,这时候APP服务器会直接通过deviceToken将消息推送到设备上。

控制器View的生命周期

loadView: 加载view

viewDidLoad:                  view加载完毕

viewWillAppear:              控制器的view将要显示

viewWillLayoutSubviews: 控制器的view将要布局子控件

viewDidLayoutSubviews: 控制器的view布局子控件完成

viewDidAppear:                控制器的view完全显示

viewWillDisappear:        控制器的view即将消失的时候

viewDidDisappear:        控制器的view完全消失的时候

你可能感兴趣的:(iOS面试总结)