任何与objc_setAssociatedObject和objc_getAssociatedObject陷阱?
我正在研究如何在所有UIView
实例中添加一个属性(在这种情况下是一个整数),无论它们是否是子类。 正在使用objc_setAssociatedObject()
和objc_getAssociatedObject()
在一个适当的,苹果认可的方式来做到这一点?
我曾经听到过一些担心这构成了“运行时间黑客”,并可能导致难以追踪和debugging的问题。 有没有其他人看到这种types的问题? 有没有更好的方式来添加整数属性到所有UIView
实例没有子类?
更新:我不能只使用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在这篇博文中提出了使用一个属性select器作为关键的技巧。
使用tag
。 这就是它的意思。