美文网首页
3.OC语言特性相关

3.OC语言特性相关

作者: Glenn_h | 来源:发表于2020-01-14 11:56 被阅读0次

    Category(分类)

    • 声明私有方法
    • 分解体积庞大的类文件
    • 把Framework的私有方法公开

    特点

    • 运行时决议
    • 可以为系统类添加分类

    可添加那些内容

    • 实例方法
    • 类方法
    • 协议
    • 属性(只生成setter和getter的声明,不会生成setter和getter的实现以及成员变量)
    • 可通过关联对象添加成员变量
    struct objc_category {
        char * _Nonnull category_name                            OBJC2_UNAVAILABLE;  //分类名
        char * _Nonnull class_name                               OBJC2_UNAVAILABLE; //类名
        struct objc_method_list * _Nullable instance_methods     OBJC2_UNAVAILABLE; //实例方法
        struct objc_method_list * _Nullable class_methods        OBJC2_UNAVAILABLE;  //类名
        struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE; //协议
    }  
    

    关联对象

    //关联对象  object:被关联的对象; key:关联的key,要求唯一;  value:关联的对象
    void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    //获取关联的对象
    id objc_getAssociatedObject(id object, const void *key)
    //移除关联的对象
    void objc_removeAssociatedObjects(id object)
    

    Extension(扩展)

    一般用扩展做什么

    • 声明私有属性
    • 声明私有方法
    • 声明私有成员变量

    特点

    • 编译时决议
    • 只以声明的形式存在,多数情况下寄生于宿主类的.m中
    • 不能为系统类添加扩展

    通知

    • 是使用观察者模式来实现的用于跨层传递消息的机制
    • 传递方式为一对多

    代理

    • 一对一

    KVO

    • KVO是OC对观察者设计模式的又一实现
    • Apple使用了isa混写(isa-swizzling)来实现KVO
    • 使用setter方法改变值kvo才会生效
    • 使用setValue:forKey:改变值kvo会生效
    • 成员变量直接修改需手动添加kvo(willChangeValueForKey 和 didChangeValueForKey)才会生效

    属性关键字

    • 读写权限
      readonly
      readwrite
    • 原子性
      atomic:线程安全
      nonatomic
    • 引用计数
      return/strong
      assign/unsafe_unretained

    assign和week有什么区别

    • assign
      修饰基本数据类型,如int,bool等
      修饰对象类型,不改变引用计数
      会产出悬垂指针。
    • weak
      不改变被修饰对象的引用计数
      所指对象在被释放之后会自动置为nil

    copy

    • 可变对象的copy和mutableCopy都是深拷贝
    • 不可变对象的copy是浅拷贝 mutableCopy都是深拷贝
    • copy方法返回的都是不可变对象

    相关文章

      网友评论

          本文标题:3.OC语言特性相关

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