为什么在主线程更新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完全消失的时候
网友评论