Objective-C类别不允许添加实例变量

时间:2016-09-10 18:55:06

标签: objective-c properties categories ivar

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

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

1 个答案:

答案 0 :(得分:0)

编辑答案以谈论实例变量而不是属性。

向对象添加实例变量会更改对象的内存分配,并要求重新编译对象。类别向现有对象添加新方法而无需重新编译,因此无法添加实例变量。

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

编辑:

如果你有一个类FooClass,其头像是这样的:

//FooClass.h
@interface FooClass : NSObject

@property (nonatomic, strong) NSString *bar1;

@end

它定义了一个具有1个属性bar1的类,并由实例变量_bar1支持。

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

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

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

@implementation FooClass

@end

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