繁体   English   中英

任何与objc_setAssociatedObject和objc_getAssociatedObject的陷阱?

[英]Any gotchas with objc_setAssociatedObject and objc_getAssociatedObject?

我正在研究如何将属性(在这种情况下为一个整数)添加到所有UIView实例,无论它们是否是子类。 在一个类别中使用objc_setAssociatedObject()objc_getAssociatedObject()是否采用Apple认可的方式来执行此操作?

我听说过一些担心,这构成了“运行时黑客”,并且可能导致难以追踪和调试的问题。 有没有人见过这类问题? 有没有更好的方法在没有子类化的情况下向所有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在这篇博文中提出了使用属性选择器作为关键的技巧。

使用tag 这就是它的意思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM