OC
oc内容如下:
1.分类
2.关联对象
3.扩展
4.代理
5.通知
6.KVO
7.KVC
8.属性关键字
1.分类
- 分类做那些事情?
1.声明私有方法
2.分解体积庞大的类文件
3.把Framwork的私有方法公开
- 分类特点
- 运行时决议
- 可以为系统类添加分类
- 分类中都可以添加哪些内容?
- 实例方法
- 类方法
- 协议
- 属性
分类结构体.png
- 分类结构体:
- 分类名称
- class成员变量
- 实例方法的列表
- 类方法的列表
- 协议列表
- 实例属性方法列表
- 分类加载调用栈
-objc_init
|
map_2_images(images 镜像)
|
map_images_nolock
|
_read_images
|
remethodize Class
- 分类总结
- 分类添加的方法可以 覆盖 原类方法
- 同名分类方法谁能生效取决于编译顺序
- 名字相同的分类会引起编译报错
面试题: 是否可以为分类添加成员变量?
2.关联对象
-
是否可以给分类添加成员变量?
分类是不能添加实例变量的,但是可以通过关联对象,添加实例变量 -
关联对象方法
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)
- 关联对象的本质
- 关联对象由AssociationsManager 管理并在 AssociationsHashMap 存储.
- 所有对象的关联内容都在同一个全局容器中.
3.扩展
- 一般用扩展做什么?
- 声明私有属性
- 声明私有方法
- 声明私有成员变量
- 扩展特点
- 编译时决议
- 声明的形式存在,多数情况下寄生于宿主类的.m中
- 不能为系统类添加扩展
4.代理
- 一种软件设计模式
- 以@protocol形式体现
- 传递方式一对一
- 代理流程
- 代理方与委托方以什么形式存在
一般声明为weak以规避循环引用
5.通知
思考-面试题:代理与通知的区别?
通知.png*通知特点
- 使用观察者模式实现的
- 用于跨层传递消息的机制
- 传递方式一对多
- 如何实现通知机制?
- 在通知中心,内部维护map表/字典,字典当中,key为通知名,作为字典当中
的key,一个通知名多个value,value作为数组列表,列表元素中包含通知接
收的观察者,观察者回调方法,列表中每个元素通知回调方法相关信息.
6.KVO
- 什么是KVO?
- KVO是OC对观察者设计模式的实现
- KVO使用isa混写(isa-swizzling)来实现KVO
KVO.png
- 观察者观察 对象A某一成员变量/成员属性
- 系统运行时动态创建NSKVONotifying_A这样的类
- 将A的isa指针指向类NSKVONotifying_A
- NSKVONotifying_A类是原来类的子类,继承关系
- NSKVONotifying_A类重写setter方法,已达到通知所有观察对象
- KVO
- 使用setter方法改变值KVO才会生效
- 使用setValue:forKey:改变值KVO才会生效
- 成员变量直接修改需手动添加KVO才会生效
7.KVC
- 什么是KVC
键值编码
-(id)valueForKey:(NSString *)key
-(void)setValue:(id)value forKey:(NSString*)key
思考-面试题:我们通过键值编码技术是否会破坏面向对象的思想?
valueForKey: 与 setValue: forKey: 中的key是没有任何限制的,在我们知道
一个类中私有变量名称的情况下,通过已知的key对成员变量设置/访问,从
这个方面考虑,KVC是会破坏面向对象的思想的.
思考-面试题: valueForKey: 与setValue: forKey:的实现流程?
- valueForKey:
-
setValueForKey:
setValueForKey.png
8.属性关键字
- 属性关键字都有哪些?
- 读写权限
- 原子性
- 引用计数
- 读写权限
- readonly
- readwrite
- 原子性
- atomic 赋值与获取,保证线程安全
- nonatomic
- 引用计数
- retain/strong
- assign/unsafe_unretained
- weak
- copy
思考-面试题:assign 与weak 区别?
assign ,修饰基本数据数据烈性,如int
assign,修饰对象类型时,不改变其引用计数
weak,不改变被修饰对象的引用计数
weak,所指对象在被释放之后会自动置为nil
思考-面试题: weak在被释放之后,为什么置为nil?
-
copy
浅拷贝和深拷贝?
浅拷贝.png
浅拷贝:对内存地址的赋值,指向同一片内存空间.
深拷贝.png
深拷贝指向两片内容相同的内存空间
浅拷贝和深拷贝区别?
- 是否开辟了新的内存空间
- 是否影响了引用计数
深拷贝开辟了内存空间,浅拷贝不会产生新的内存空间
深拷贝不会影响引用计数,浅拷贝会影响引用计数
-
copy关键字的使用?
copy关键字的使用.png
- 可变对象的copy和mutableCopy都是深拷贝
- 不可变对象的copy是浅拷贝,mutableCopy是深拷贝
- copy方法返回的都是不可变对象
- @properyt(copy)NSMutableArray *array (面试题)
- 如果赋值过来的NSMutableArray,copy之后是NSArray
- 如果赋值过来的NSArray,copy之后是NSArray
OC:
- MRC下如何重写retain修饰变量的setter方法?
@property (nonatomic,reatin) id obj;
-(void)setObj:(id)obj{
if(_obj != obj){
[_obj release];
_obj = [obj retain];
}
}
面试题:
- 请简述分类实现原理
- 运行时决议;
- 分类添加的方法可以 覆盖 原类方法;
- 同名分类方法谁能生效取决于编译顺序;
- KVO的实现原理?
- KVO是OC对观察者设计模式的实现
- KVO使用isa混写(isa-swizzling)来实现KVO
- 能否为分类添加成员变量?
- 通过关联对象为分类添加成员变量
QQ交流群: 796142709
网友评论