Objective-C 扩展机制之 - associative

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这些,你们都看的懂的。

具体的看 代码,简单的很!例子就是给UIView通过类目的方式扩展了几个block属性从而实现了UIView的单击、双击等事件。



你可能感兴趣的:(Objective-C 扩展机制之 - associative)