美文网首页
Category,Extension,NSNotificatio

Category,Extension,NSNotificatio

作者: 分流替躺欧阳克 | 来源:发表于2019-06-18 00:25 被阅读0次

    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,NSNotificatio

          本文链接:https://www.haomeiwen.com/subject/ueanfctx.html