objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?

2023-11-26

我正在研究向所有属性添加属性(在本例中为整数)的方法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(使用前将#替换为@)

objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗? 的相关文章

随机推荐