分类、扩展、KVO、KVC、通知、代理等

2020-05-20  本文已影响0人  Oh丶Really

分类(Category)

作用:

特点:

可以添加的内容:

Category源码:

image

加载调用栈:

image

总结:

关联对象

能否给分类添加 “成员变量” ?

可以,但是是通过关联对象的方法添加; 
添加的关联对象并没有被添加到原宿主类,而是存储在AssociationsHashMap中,由AssociationsManager管理;
所有对象的关联内容都在一个全局容器中;
id  objc_getAssociatedObject(id objct, const void * key)

void  objc_setAssociatedObject(id objct, const void* key,
                               id value, objc_AssociationPolic polic)
                               
void  objc_removeAssociatedObjects(id object)

image

扩展(Extension)

一般用扩展做什么

扩展的特点

代理(Delegate)

通知(NSNotification)

如何实现通知机制?

image

Observers_list 是一个数组,用来存储观察者以及回调方法

KVO

实现机制:

image

NSKVONotification_A的setter实现:

image

通过KVC设置value能否生效?

可以生效
KVC会调用setter方法,又setter方法被重写,所以KVO可以生效

通过成员变量直接赋值value能否生效?

不会生效
可以手动KVO实现,在赋值前调用 willChangeValueForKey,赋值后调用didChangeValueForKey

总结:

KVC

属性关键字

分类:

读写权限:

原子性

引用计数

assign:
weak:
copy:
浅拷贝:
* 会使被拷贝对象的引用计数加一
* 不会重新分配新的内存
浅拷贝:
* 不会使被拷贝对象的引用计数变化
* 会重新分配新的内存
image
总结:

练习

1、MRC下如何重写retain修饰变量的setter方法

@property (nonatomic, retain) id obj;

- (void)setObj:(id)obj{
    if (_obj != obj){
    [_obj release];
    _obj = [obj retain];
    }
}

2、简述分类的实现原理

* 由运行时决议的
* 不同分类中含有的同名分类方法最终生效取决于编译时谁最后参与编译
* 分类方法会覆盖同名的宿主方法

3、KVO的实现原理
4、为分类添加成员变量

上一篇下一篇

猜你喜欢

热点阅读