Category,Extension,NSNotification,KVO记录

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"];这两个方法也能达到调用监听回调的方法。

你可能感兴趣的:(Category,Extension,NSNotification,KVO记录)