我正在研究向所有属性添加属性(在本例中为整数)的方法UIView
实例,无论它们是否是子类。正在使用objc_setAssociatedObject()
and objc_getAssociatedObject()
在一个类别中,有什么合适的、苹果认可的方法可以做到这一点?
我听说有人担心这构成“运行时黑客”,并可能导致难以追踪和调试的问题。还有其他人见过这种类型的问题吗?有没有更好的方法为所有添加整数属性UIView
没有子类化的实例?
Update:我不能只使用tag
,因为这需要在已经使用的代码库中使用tag
对于其他事情。相信我,如果我可以使用tag
为此,我愿意!
每当你想在类上伪造 ivar 时,关联对象就会派上用场。它们非常通用,因为您可以将任何对象与该类关联。
也就是说,您应该明智地使用它,并且仅用于子类化感觉很麻烦的小事情。
但是,如果您唯一的要求是将一个整数添加到所有UIView
实例,tag
是要走的路。它已经存在并可供您使用,因此无需涉及运行时修补UIView
.
如果您想标记您的UIView
对于大于整数的东西,例如通用对象,您可以定义一个类别,如下所示。
UIView+Tagging.h
@interface UIView (Tagging)
@property (nonatomic, strong) id customTag;
@end
UIView+Tagging.m
#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 在此提出博客文章.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)