Objective c objc_setAssociatedObject添加的ivar是否与类声明中的公共ivar相同?

Objective c objc_setAssociatedObject添加的ivar是否与类声明中的公共ivar相同?,objective-c,runtime,Objective C,Runtime,与之相比: @interface XXX : NSObject { NSString *any; } 它们都放在下面的位置了吗 objc_setAssociatedObject(self, "any", @"xxx", OBJC_ASSOCIATION_COPY); 不,这些是不同的技术 ivar是在编译时定义的,当一个实例被分配时,它的内存空间被分配。(请记住,NSString*是ivar的类型,因此分配了引用的内存空间,而不是NSString本身的实例。) 关联存储在与实例

与之相比:

@interface XXX : NSObject {
    NSString    *any;
}
它们都放在下面的位置了吗

objc_setAssociatedObject(self, "any", @"xxx", OBJC_ASSOCIATION_COPY);

不,这些是不同的技术

ivar是在编译时定义的,当一个实例被分配时,它的内存空间被分配。(请记住,
NSString*
是ivar的类型,因此分配了引用的内存空间,而不是
NSString
本身的实例。)

关联存储在与实例相关的字典式内存空间中

但是,如果要设置仅在运行时知道其键的值,请使用键值编码:

struct objc_ivar_list *ivars 
这将执行setter
-setAny:
,这可能会设置ivar

声明声明的属性(
@property
)是完全不同的。属性声明只声明方法。如果在类或类延续中完成,则在某些情况下会合成ivar。在一个类别中,它永远不会被合成,因为合成在一个类别中是不可能的


这是我的错,我没有表达清楚,我想知道当我使用关联时,是否有一个新的ivar放入objc_ivar_列表中。现在我明白了。Thx。你能告诉我,当我在一个类及其分类中声明一个属性时,有什么区别吗?为什么要这样设计?Max Wang Dec 17,7:51

对不起,我没有足够的声誉来添加评论来回答这个问题。
让我告诉你类中属性和类中属性的区别。如您所知,如果在类中声明了一个属性,编译器将自动为该属性生成setter和getter方法。然而,在category中,即使允许您为该类声明属性,编译也不会为您生成setter和getter方法。如果您尝试访问类别中声明的属性,Xcode将抛出
***由于未捕获的异常“NSInvalidArgumentException”,终止应用程序,原因:'-[XXXX setSomeProperty:]:由于没有现有方法,无法识别的选择器发送到实例0x798342c0'
。这就是为什么我们需要objc_setAssociatedObject和objc_getAssociatedObject来手动生成setter和getter。

我不这么认为,因为
objc_setAssociatedObject
在单个类实例上工作,而不是在类上。通过
objc_setAssociatedObject()添加的对象
根本不是ivar。这是我的错,我没有表达清楚,我想知道当我使用关联时,objc_ivar_列表中是否有新的ivar。现在我明白了。Thx。你能告诉我,当我在一个类中声明一个属性及其分类时,有什么不同吗?为什么要这样设计
[self setValue:@"xxx" forKey:@"any"];