gpt4 book ai didi

ios - objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?

转载 作者:可可西里 更新时间:2023-11-01 03:52:20 33 4
gpt4 key购买 nike

我正在研究向所有 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+标签.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 中提出了使用属性的选择器作为键的技巧。 .

关于ios - objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16019782/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com