分类:
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