1.block为什么使用copy关键字
- block是一个特殊的oc对象,建立在栈上,而不是堆上,这么做一个是为性能考虑,还有就是方便访问局部变量。
- 默认Block使用到的局部变量会被copy,而不是retain。所以,他无法改变局部变量的值。如果在变量前加上__block那么编译器不会复制变量,而是去找变量的地址,通过地址来访问变量,实际上就是直接操作变量。
- 另外block是在栈上分配的,所以一旦离开作用域,就会释放。因此要把block用在别处时,必须要copy一份。block不能保留,retain没有意义。
2.load和initialize区别
- 调用时刻:
load
是在pre-main阶段调用,且只会调用1次。initialize
是在类第一次接受到消息(被调用)时调用(main函数之后),每个类只会initialize一次(父类的initialize会被调用多次。不冲突,子类没有,就调用父类的) - 调用顺序: 父类的load -> 子类的load -> 分类的load,initialize先初始化父类->再初始化子类
- 实际使用: load方法一般用于方法交换,initialize方法一般用于初始化全局变量或静态变量。
- load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。
2.kvc的实现原理
3.常用的设计模式
- 代理
- KVO
- 单例
- mvc、mmvm
4.分类和扩展之间的区别
(1)Category
- 不可以添加属性,需要通过runtime添加属性。
- 如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类
- 如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法
(2)Extension
- Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”。一般写在.m文件中,用来扩展私有属性和方法。
- 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。
(3)区别
- Category只可以添加方法,Extension可以添加属性和方法。
- Extension只能用于自身类,而不能用于子类或者其他地方。
- Extension中声明的方法必须要实现,否则编译器警告。Category不会。这是因为Extension是编译阶段被添加到类中,Category是运行时被添加到类中。
5.代理、通知、block的区别
- 通知是一对多,很多控制器想要知道一个事件
- 代理一对一,注重过程的回调,如webview的加载 ,将要加载、开始加载、加载完成、加载错误都是通过代理回调。
- block一对一,相比代理语法更加简洁。更注重结果的回调的结果。同时要注意循环引用。
网友评论