我正在寻找将属性(在本例中为整数)添加到所有UIView
实例的方法,无论它们是否为子类。在类别中使用objc_setAssociatedObject()
和objc_getAssociatedObject()
是否采用Apple认可的方式?
我听到一些担心这会构成“运行时黑客”,并且可能导致难以追踪和调试的问题。有没有人见过这类问题?有没有更好的方法可以在没有子类化的情况下向所有UIView
实例添加整数属性?
更新:我不能只使用tag
,因为这需要在已经使用tag
进行其他操作的代码库中使用。相信我,如果我可以使用tag
,我会!
答案 0 :(得分:8)
每当你想在课堂上伪造一个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在blog post中提出了使用属性的选择器作为键的技巧。
答案 1 :(得分:-2)
使用tag
。这就是它的意思。