Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标-C类别不';不允许添加实例变量_Objective C_Properties_Categories_Ivar - Fatal编程技术网

Objective c 目标-C类别不';不允许添加实例变量

Objective c 目标-C类别不';不允许添加实例变量,objective-c,properties,categories,ivar,Objective C,Properties,Categories,Ivar,我想知道为什么Objective-C类别设计模式的设计方式无法添加实例变量 我也知道,使用Objective-C关联对象,我们可以做到。但我更感兴趣的是,这背后的主要原因是什么 答案经过编辑以讨论实例变量而不是属性。 向对象添加实例变量会更改对象的内存分配,并要求重新编译对象。类别向现有对象添加新方法而不需要重新编译,因此无法添加实例变量 正如您所说,您可以在使用关联存储保存和加载数据的位置添加属性 编辑: 如果您有一个标题如下的类FooClass: //FooClass.h @interfac

我想知道为什么Objective-C类别设计模式的设计方式无法添加实例变量

我也知道,使用Objective-C关联对象,我们可以做到。但我更感兴趣的是,这背后的主要原因是什么

答案经过编辑以讨论实例变量而不是属性。 向对象添加实例变量会更改对象的内存分配,并要求重新编译对象。类别向现有对象添加新方法而不需要重新编译,因此无法添加实例变量

正如您所说,您可以在使用关联存储保存和加载数据的位置添加属性

编辑: 如果您有一个标题如下的类FooClass:

//FooClass.h
@interface FooClass : NSObject

@property (nonatomic, strong) NSString *bar1;

@end
它定义了一个类,该类具有1个属性
bar1
,并由实例变量
\u bar1
支持

FooClass
的外部类别无法向
FooClass
添加额外的实例变量

但是,您可以在.m文件中为FooClass创建一个“私有类别”,该类别可以为该类定义其他属性(使用支持实例变量)。它之所以能够工作,是因为这些额外的实例变量在编译时是已知的,并且可以“烘焙”到类中。下面是一个例子:

//  FooClass.m
@interface FooClass()
@property (nonatomic, strong) NSString*bar2;
@end

@implementation FooClass

@end

请注意额外的@interface声明,以及一个附加属性。由于它与实现位于同一个.m文件中,因此不会暴露于其他文件,但它在编译时是已知的,因此编译器可以添加所需的实例变量。

如何演示“向对象添加存储属性会更改对象的内存分配”。你能给我举个例子吗。谢谢你回复我的答案。请把术语弄对。Objective-C类别允许您添加属性。他们不允许你添加实例变量。rmaddy,说得好。我会修改我的答案,邓肯。谢谢你的简要解释。我理解类别和扩展的概念。我仍然不明白在向对象添加ivar时如何更改其内存位置并要求重新编译对象。