首先要明白什么是属性:
属性 = ivar + setter + getter(成员变量+setter方法+getter方法)。
在category中添加属性,category只会声明setter,getter,而不会去实现。编译的时候,是可以通过的,但是会报警告。
在别处调用这个属性的setter、getter方法,程序也会闪退。
如果要想实现,就要用runtime手动实现setter、getter方法。
在getter、setter方法中分别使用objc_getAssociatedObject、objc_setAssociatedObject动态获取、绑定这个属性。
category的结构体定义如下:
struct category_t {
constchar*name;//类的名字(name)
classref_t cls;//类(cls)
struct method_list_t *instanceMethods; //category中所有给类添加的实例方法的列表(instanceMethods)
struct method_list_t *classMethods;//category中所有添加的类方法的列表(classMethods)
struct protocol_list_t *protocols; //category实现的所有协议的列表(protocols)
struct property_list_t *instanceProperties;//category中添加的所有属性(instanceProperties)
};