我想知道为什么Objective-C设计模式的设计方式是我们无法添加实例变量。
我也开始知道使用Objective-C相关对象我们可以做到。但我更感兴趣的是它背后的主要原因是什么。
答案 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文件中,所以它不会暴露给其他文件,但在编译时是已知,因此编译器可以添加所需的实例变量。