6

我正在研究向所有UIView实例添加属性(在本例中为整数)的方法,无论它们是否是子类。在一个类别中使用objc_setAssociatedObject()objc_getAssociatedObject()是苹果认可的适当方式吗?

我听说这会构成“运行时黑客攻击”,并可能导致难以追踪和调试的问题。有没有其他人见过这种类型的问题?有没有更好的方法来为所有UIView实例添加一个整数属性而不进行子类化?

更新:我不能只使用tag,因为这需要在已经tag用于其他事情的代码库中使用。相信我,如果我能用tag这个,我会的!

4

2 回答 2

8

每当您想在类上伪造 ivar 时,关联对象就会派上用场。它们非常通用,因为您可以将任何对象与该类相关联。

也就是说,您应该明智地使用它,并且只用于子类化感觉很麻烦的小事情。

但是,如果您唯一的要求是向所有UIView实例添加一个整数,tag那么就是要走的路。它已经存在并可供您使用,因此无需在运行时修补UIView.

如果你想用比整数更多的东西来标记你UIView的东西,比如通用对象,你可以定义一个如下所示的类别。

UIView+标记.h

@interface UIView (Tagging)
@property (nonatomic, strong) id customTag;
@end

UIView+标签.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 最近在这篇文中提出了使用属性选择器作为键的技巧。

于 2013-04-15T16:13:47.187 回答
-2

使用tag. 这就是它的目的。

于 2013-04-15T16:07:54.237 回答