ITKeyword,专注技术干货聚合推荐

注册 | 登录

关联对象

kmyhy 分享于 2016-08-01

推荐:关联对象 Associated Object

需要在对象中存放某些信息,但是又无法从对象的所在类中继承一个子类,这时用到关联对象Associated Object。 例子 http://blog.csdn.net/lw223/article/details/

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1054

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

我们知道从 O-C 2.0 开始就有关联对象(associated object)这个东西。与关联对象相关的函数在 <objc/runtime.h> 中定义 : objc_setAssociatedObject objc_getAssociatedObject objc_removeAssociatedObjects 别看这个东西不起眼!实际上通过它我们可以实现一些原来做不到的功能,比如说:在对一个类进行扩展(category)时,允许我们为类定义新的属性(存储属性)? 咦,有点意思吧! 不是说无法在扩展或 Category 中定义存储属性(即实例变量 var)的吗? 让我们来看看是怎么做到的吧! Objective-C 首先,在 Category 中定义一个属性: @interface NSObject (AssociatedObject)@property (nonatomic, strong) id associatedObject;@end 然后实现这个 Category: @implementation NSObject (AssociatedObject)@dynamic associatedObject;- (void)setAssociatedObject:(id)object {

objc_setAssociatedObject(self, @selector(associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (id)associatedObject {

return objc_getAssociatedObject(self, @selector(associatedObject));} 注意:这里使用了一个枚举 OBJC_ASSOCIATION_RETAIN_NONATOMIC 这表示,用于修饰该属性的存储定义,等于我们常用的 retain、nonatomtic 等关键字。可能的取值还包括: * OBJC_ASSOCIATION_ASSIGN * OBJC_ASSOCIATION_COPY_NONATOMIC * OBJC_ASSOCIATION_RE

推荐:Objective-C语法之Object对象的那些事儿(五)

创建一个类 鼠标右键单击HelloWorld工程,弹出列表选择框后 单击 New File... 在工程中添加一个新的文件。 选择创建一个Objective-C.class的 文件,点击next继续

TAIN * OBJC_ASSOCIATION_COPY 每个枚举值的作用如同其字面意义。 这里的 @selector 其实只是起一个 key 的作用,保证在存储和读取自定义属性时能够找到这个对象。也可以用一个常量的 int 来代替 @selector,只要保证对于每个属性来说 key 是唯一的就好: static char kAssociatedObjectKey; 然后在在访问 associated 时使用这个常量作为第二个参数: objc_getAssociatedObject(self, &kAssociatedObjectKey); Swift 因为 Swift 标准库中不包含 O-C 运行时库,所以我们首先 import: import ObjectiveC 然后为属性的存储定义一个 key: // Declare a global var to produce a unique address as the assoc object handlevar AssociatedObjectKey: UInt8 = 0 然后定义属性的 getter/setter: var previewSupport:Bool{

// previewSupport is *effectively* a stored property

get {

return objc_getAssociatedObject(self, &AssociatedObjectKey) as? Bool ?? false

// Set the initial value to false when absence

}

set {

objc_setAssociatedObject(self, &AssociatedObjectKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_ASSIGN))

}

} 这样,表面上看 previewSupport 是一个计算属性,但实际上存储了一个对象在里面。

推荐:Effective Objective-C(第6-10条)对象、属性、equalToString、关联对象

    用OC等面向对象语言编程时,“对象”(object)就是“基本构造单元”(building block),开发者可以通过对象来存储并传递数据。在对象之间传递数据并执行任

我们知道从 O-C 2.0 开始就有关联对象(associated object)这个东西。与关联对象相关的函数在 <objc/runtime.h> 中定义 : objc_setAssociatedObject objc_getAssociatedObject objc_removeAssoc

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。