一、分类
1、你用分类都做了哪些事?
(1)、声明私有方法
(2)、分解体积庞大的类文件
(3)、把Framework的私有方法公开
2、特点
(1)、运行时决议(运行时才会添加到宿主类)
(2)、可以为系统类添加分类
3、 分类中都可以添加哪些内容?
(1)、实例方法
(2)、类方法
(3)、协议
(4)、属性(只会生成set、get方法,不会生成成员变量)
4、分类加载调用栈
5、源码分析
(1)、分类添加的方法可以"覆盖"原类方法。
(2)、同名分类方法谁能生效取决于编译顺序。
(3)、名字相同的分类会引起编译报错。
二、关联对象
1、能否给分类添加”成员变量”?
id objc_getAssociatedObject(id object, const void * key)
void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
void objc_removeAssociatedObjects(id object)
2、(关联对象的本质)分类添加的成员变量,添加到成员变量数组里面了吗?
(1)、关联对象由AssociationsManger管理,并在AssociationsHashMap存储。
(2)、所有对象的关联内容都在同一个全局容器中。
3、源码分析
三、扩展
1、一般用扩展做什么?
(1)、声明私有属性
(2)、声明私有方法
(3)、声明私有成员变量
2、特点?
(1)、编译时决议
(2)、只以声明的形式存在,多数情况下寄生于宿主类的.m中。
(3)、不能为系统类添加扩展。
四、代理
1、准确的说是一种软件设计模式。
2、iOS当中以@protocol形式体现。
3、传递方式一对一。
4、工作流程。
5、一般声明为weak,以规避循环引用。
五、通知(NSNotification)
1、特点
(1)、是使用观察者模式来实现的用于跨层传递消息的机制。
(2)、传递方式为一对多。
2、如何实现通知机制?
六、KVO
1、KVO介绍
KVO是Key-value observing的缩写。
KVO是OC对观察者设计模式的又一实现。
Apple使用了 isa 混写 (isa-swizzling) 来实现KVO。
2、特点
使用setter方法改变值,KVO才会生效。
使用setValue: forKey: 改变值,KVO才会生效。
成员变量直接修改,需手动添加KVO才会生效。
3、通过kvc设置value能否生效?为什么
可以,kvc会重写setter方法。
4、通过成员变量直接赋值value能否生效?
不可以。可以在给成员变量赋值前后手动添加 [self willChangeValueForKey: ] 和 [self didChangeValueForKey: ] 。didChangeValueForKey方法会触发KVO回调。
七、KVC
KVC是key-value coding的缩写。
-(id)valueForKey:(NSString *)key
-(void)setValue:(id)value forKey:(NSString *)key
1、-(id)valueForKey:(NSString *)key 介绍
2、-(void)setValue:(id)value forKey:(NSString *)key 介绍
八、属性关键字
1、读写权限 readonly、readwrite(默认)
2、原子性 atomic(默认)、nonatomic。
atomic只能保证赋值和获取是线程安全(成员属性),不能保证操作和访问线程安全。例如NSArray,可以保证赋值和获取对象线程安全,不能保证删除和添加对象线程安全。
3、引用计数
(1)、retain/strong 都用于修饰对象。
(2)、assign/unsafe_unretained
修饰基本数据类型,如int、BOOL等。
修饰对象类型时,不改变其引用计数。
会产生悬垂指针。
(3)、weak
不改变被修饰对象的引用计数。
所指对象在被释放之后会自动置为nil。
(4)、copy
1>、深拷贝、浅拷贝区别
是否开辟了新的内存空间
是否影响了引用计数
2>、
总结:
可变对象的copy和mutableCopy都是深拷贝。
不可变对象的copy是浅拷贝,mutableCopy是深拷贝。
copy方法返回的对象都是不可变对象。
3>、copy面试题
OC语言特性面试总结
1、MRC下如何重写retain修饰变量的setter方法?
2、请简述分类实现原理。
3、KVO的实现原理是咋样的?
4、能否为分类添加成员变量?