任何与objc_setAssociatedObject和objc_getAssociatedObject的陷阱?

时间:2013-04-15 16:05:06

标签: ios objective-c objective-c-runtime

我正在寻找将属性(在本例中为整数)添加到所有UIView实例的方法,无论它们是否为子类。在类别中使用objc_setAssociatedObject()objc_getAssociatedObject()是否采用Apple认可的方式?

我听到一些担心这会构成“运行时黑客”,并且可能导致难以追踪和调试的问题。有没有人见过这类问题?有没有更好的方法可以在没有子类化的情况下向所有UIView实例添加整数属性?

更新:我不能只使用tag,因为这需要在已经使用tag进行其他操作的代码库中使用。相信我,如果我可以使用tag,我会!

2 个答案:

答案 0 :(得分:8)

每当你想在课堂上伪造一个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在blog post中提出了使用属性的选择器作为键的技巧。

答案 1 :(得分:-2)

使用tag。这就是它的意思。