objc_setAssociatedObject添加的ivar和Class声明的普通ivar一样吗?
Is an ivar added by objc_setAssociatedObject the same as common ivar in Class declaration?
@interface XXX : NSObject {
NSString *any;
}
比较:
objc_setAssociatedObject(self, "any", @"xxx", OBJC_ASSOCIATION_COPY);
都放在下面的位置了吗?
struct objc_ivar_list *ivars
不,这些是不同的技术。
ivar 是在编译时定义的,当分配一个实例时,会为它分配内存space。 (请记住 NSString*
是 ivar 的类型,因此分配的内存 space 用于引用,而不是用于 NSString
本身的实例。)
关联存储在与实例相关的字典样式内存中space。
但是,如果你想设置一个值,你只在运行时知道它的键,使用键值编码:
[self setValue:@"xxx" forKey:@"any"];
这将执行 setter -setAny:
,可能会设置 ivar。
声明 声明 属性 (@property
) 是完全不同的事情。 属性 声明 仅 声明方法。如果它是在 class 或 class 延续中完成的,则在某些情况下会合成一个 ivar。在一个类别中它永远不会被合成,因为在一个类别中不可能合成。
It's my fault that I didn't express clearly, I want to know if there is a new ivar put into objc_ivar_list when I use association. Now I understand.Thx.And can you tell me is there any differences when I declare a property in a Class and its catagory?And why design like this – Max Wang Dec 17 at 7:51
抱歉,我没有足够的声誉来添加评论来回答这个问题。
让我告诉你 属性 在 Class 和类别中的区别。如果在class中声明了一个属性,编译器会自动为这个属性生成setter和getter方法,如你所知。但是,在类别中,即使您被允许为 class、 声明 属性,编译也永远不会为您生成 setter 和 getter 方法。如果您尝试访问类别中声明的 属性,Xcode 将抛出 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XXXX setSomeProperty:]: unrecognized selector sent to instance 0x798342c0'
,因为不存在现有方法。这就是为什么我们需要objc_setAssociatedObject和objc_getAssociatedObject来手动生成setter和getter。
@interface XXX : NSObject {
NSString *any;
}
比较:
objc_setAssociatedObject(self, "any", @"xxx", OBJC_ASSOCIATION_COPY);
都放在下面的位置了吗?
struct objc_ivar_list *ivars
不,这些是不同的技术。
ivar 是在编译时定义的,当分配一个实例时,会为它分配内存space。 (请记住 NSString*
是 ivar 的类型,因此分配的内存 space 用于引用,而不是用于 NSString
本身的实例。)
关联存储在与实例相关的字典样式内存中space。
但是,如果你想设置一个值,你只在运行时知道它的键,使用键值编码:
[self setValue:@"xxx" forKey:@"any"];
这将执行 setter -setAny:
,可能会设置 ivar。
声明 声明 属性 (@property
) 是完全不同的事情。 属性 声明 仅 声明方法。如果它是在 class 或 class 延续中完成的,则在某些情况下会合成一个 ivar。在一个类别中它永远不会被合成,因为在一个类别中不可能合成。
It's my fault that I didn't express clearly, I want to know if there is a new ivar put into objc_ivar_list when I use association. Now I understand.Thx.And can you tell me is there any differences when I declare a property in a Class and its catagory?And why design like this – Max Wang Dec 17 at 7:51
抱歉,我没有足够的声誉来添加评论来回答这个问题。
让我告诉你 属性 在 Class 和类别中的区别。如果在class中声明了一个属性,编译器会自动为这个属性生成setter和getter方法,如你所知。但是,在类别中,即使您被允许为 class、 声明 属性,编译也永远不会为您生成 setter 和 getter 方法。如果您尝试访问类别中声明的 属性,Xcode 将抛出 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XXXX setSomeProperty:]: unrecognized selector sent to instance 0x798342c0'
,因为不存在现有方法。这就是为什么我们需要objc_setAssociatedObject和objc_getAssociatedObject来手动生成setter和getter。