任何与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 。 这就是它的意思。