![](/img/trans.png)
[英]`objc_setAssociatedObject` and `objc_getAssociatedObject` isn't match
[英]Any gotchas with objc_setAssociatedObject and objc_getAssociatedObject?
我正在研究如何将属性(在这种情况下为一个整数)添加到所有UIView
实例,无论它们是否是子类。 在一个类别中使用objc_setAssociatedObject()
和objc_getAssociatedObject()
是否采用Apple认可的方式来执行此操作?
我听说过一些担心,这构成了“运行时黑客”,并且可能导致难以追踪和调试的问题。 有没有人见过这类问题? 有没有更好的方法在没有子类化的情况下向所有UIView
实例添加整数属性?
更新:我不能只使用tag
,因为这需要在已经使用tag
用于其他事物的代码库中使用。 相信我,如果我可以使用tag
,我会的!
只要你想在一个类上伪造一个ivar,相关的对象就派上用场了。 它们非常通用,因为您可以将任何对象与该类相关联。
也就是说,你应该明智地使用它,只适用于子类化感觉很麻烦的小事情。
但是,如果您唯一的要求是向所有UIView
实例添加一个整数,那么tag
就是您的选择。 它已经存在并且可供您使用,因此无需涉及UIView
运行时修补。
如果您想要使用超过整数的东西来标记UIView
,比如通用对象,则可以定义类似如下的类别。
@interface UIView (Tagging)
@property (nonatomic, strong) id customTag;
@end
#import <objc/runtime.h>
@implementation UIView (Tagging)
@dynamic customTag;
- (id)customTag {
return objc_getAssociatedObject(self, @selector(customTag));
}
- (void)setCustomTag:(id)aCustomTag {
objc_setAssociatedObject(self, @selector(customTag), aCustomTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
最近,Erica Sadun在这篇博文中提出了使用属性选择器作为关键的技巧。
使用tag
。 这就是它的意思。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.