2020-03-09

分类:

Category
Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
  char *category_name                          OBJC2_UNAVAILABLE; // 分类名
  char *class_name                             OBJC2_UNAVAILABLE; // 分类所属的类名
  struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 实例方法列表
  struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 类方法列表
  struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分类所实现的协议列表
}
  • 运行时添加类方法列表、实例方法列表、实现协议列表,没有属性列表,使用@property添加的属性,编译期间不会报错,但是不会创建成员变量
  • runtime通过objc_setAssociatedObject/objc_getAssociatedObject方法关联在hash表中,但并没有创建成员变量
  • 如果分类方法和原类同名,因为分类是运行时被添加到类中的,倒叙遍历查找方法名时,会优先调用分类方法,忽略原类方法。

扩展:

添加私有属性,

@interface XXX ()
//编译时期添加**私有**属性、方法
//私有方法(如果不实现,编译时会报警,Method definition for 'XXX' not found)
@end

KVO

KVC

  • KVC设值顺序
    -setKey > _key >_isKey > key > isKey
    如果accessInstanceVariablesDirectly方法返回NO,只会访问setKey。
  • KVC设值
    getKey>key>isKey>Array的方法(countofKey)>NSSet方法
    如果accessInstanceVariablesDirectly方法返回YES,会直接访问_key>_isKey>key>isKey
  • 集合的处理
    当对容器类使用KVC时,valueForKey:将会被传递给容器中的每一个对象,返回一个集合
  • 用途
    动态取值
    访问私有变量
    字典 模型转换 结合runtime

https://www.jianshu.com/p/b9f020a8b4c9

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容