category 作用
- 声明私有方法
- 分解体积旁大的类文件
- 把framework的私有方法公开
特点
编译时编译分类代码,但是到运行时才把分类方法属性协议代理等添加到宿主类
- 分类添加的方法可以"覆盖"原类方法
- 同名类方法谁能生效取决于编译顺序
- 名字相同的分类会引起编译报错。
可以添加哪些内容
- 实例方法
- 类方法
- 协议
- 属性:只是添加了get和set方法,并没有添加_property成员变量
category结构体
struct category_t {
const char *name;//分类名称
classref_t cls://所属类
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct protocol_list_t *protocols;
struct property_list_t *instanceMethods;
method_list_t *methodsForMeta(bool isMeta){
if(isMeta) return classMethods;
else return instanceMethods;
}
property_list_t *propertiesForMeta_(bool isMeta){
if(isMeta)return nil;
else return instanceProperties;
}
}
扩展(Extension)
- 编译时决议
- 只以声明的形式存在,多数情况下寄生于宿主类的m文件
- 不能为系统类添加扩展
代理(Delegate)
- 一种软件设计模式
- iOS当中以@protocol形式表现
- 传递方式一对一
通知(NSNotification)
通知者发生消息,经由通知中心向多个接收者发送消息
- 使用观察者模式来实现的用于跨层传递消息的机制
- 传递方式一对多
内部大致有个map,以通知名为key,所有的观察者列表为value。
KVO(key-value-observing)
KVO是Objective-C对观察者设计模式的又一实现。
Apple使用了isa混写(isa-swizzling)来实现KVO
当调用addObserver方法后,系统会在运行时动态创建NSKVONotifying_A这么个类,将原来的类的isa指针指向这个类,通过重这个类的set方法实现通知观察者
- (void)setValue:(id)obj
{
[self willChangeValueForKey:@"KeyPath"];
[super setValue:obj];
[self didChangeValueForKey:@"KeyPath"];
}
我们手动调用[self willChangeValueForKey:@"KeyPath"];[self didChangeValueForKey:@"KeyPath"];这两个方法也能达到调用监听回调的方法。
网友评论