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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,665评论 1 32
  • 上半年有段时间做了一个项目,项目中聊天界面用到了音频播放,涉及到进度条,当时做android时候处理的不太好,由于...
    DaZenD阅读 3,101评论 0 26
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,302评论 0 12
  • KVO概述 键值观察Key-Value-Observer就是观察者模式。 观察者模式的定义:一个目标对象管理所有依...
    小希嘻阅读 704评论 0 0
  • 1. 果宝性格比较随我,容易急躁。而他表现的方式就是一着急就哭。比如一件很小的事情:上楼按电梯,我们不小心顺手给按...
    慢养娃阅读 2,306评论 1 3

友情链接更多精彩内容