objc_getAssociatedObject和objc_setAssociatedObject

由于swift中的extension不可以扩展存储属性。于是看到了这两个方法。

这两个函数都有associate,意思就是关联。


public func objc_setAssociatedObject(object: AnyObject!, _ key: UnsafePointer, _ value: AnyObject!, _ policy: objc_AssociationPolicy)


public func objc_getAssociatedObject(object: AnyObject!, _ key: UnsafePointer) -> AnyObject!

objc_setAssociatedObject可以将object和value关联起来。为了可以日后找到这个关联关系,这里就需要定义一个key。还有关联的策略policy

enum {
case OBJC_ASSOCIATION_ASSIGN ,
case OBJC_ASSOCIATION_RETAIN_NONATOMIC ,
case OBJC_ASSOCIATION_COPY_NONATOMIC ,
case OBJC_ASSOCIATION_RETAIN ,
case OBJC_ASSOCIATION_COPY
};```

objc_getAssociatedObject就可以利用key找到关联到object上的那个对象。

这里当把object和value关联起来以后,这个value就相当于object的一个属性一样的存在。

例如:

private struct AssociatedKeys {
static var itemName = "itemName"
}
extension MKAnnotation {
var itemName: String! {
get {
guard let str = objc_getAssociatedObject(self, &AssociatedKeys.itemName) as? String else { return nil }
return str
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.itemName, String(newValue),.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}




还看到有文章写到可以利用这两个函数传值,或者给button增加一个blockHandler,还可以做其他好多事,暂时没有接触到。

你可能感兴趣的:(objc_getAssociatedObject和objc_setAssociatedObject)