Objective-C的扩展机制,除了category其实还有一个associative。
category比较常见,作用就是给现有的类扩展一些新的方法。
那么associative呢,就是做到了category做不到的东西,可以扩展属性。
官方文档:Objective-C Runtime Reference
要使用associative,必须得先 #import <objc/runtime.h>
然后才可以使用下面的方法进行扩展
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1); OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1); OBJC_EXPORT void objc_removeAssociatedObjects(id object) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects都是OC中的外联方法。
通过objc_setAssociatedObject设置一个属性,objc_getAssociatedObject获取一个属性,objc_removeAssociatedObjects删除一个通过associative扩展的属性。
object 参数作为待扩展的对象实例,key作为该对象实例的属性的键,而value就是对象实例的属性的值,policy作为关联的策略,它的枚举包括:
enum { OBJC_ASSOCIATION_ASSIGN = 0, OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, OBJC_ASSOCIATION_COPY_NONATOMIC = 3, OBJC_ASSOCIATION_RETAIN = 01401, OBJC_ASSOCIATION_COPY = 01403 }; typedef uintptr_t objc_AssociationPolicy;很简单,就是assign、retain、copy这些,你们都看的懂的。