【发布时间】:2016-09-10 18:55:06
【问题描述】:
我想知道为什么 Objective-C 的类别设计模式设计成我们无法添加实例变量的方式。
而且我也开始知道使用 Objective-C 关联的对象我们可以做到。但我更感兴趣的是它背后的主要原因是什么。
【问题讨论】:
标签: objective-c properties categories ivar
我想知道为什么 Objective-C 的类别设计模式设计成我们无法添加实例变量的方式。
而且我也开始知道使用 Objective-C 关联的对象我们可以做到。但我更感兴趣的是它背后的主要原因是什么。
【问题讨论】:
标签: objective-c properties categories ivar
向对象添加实例变量会改变对象的内存分配,并要求重新编译对象。类别无需重新编译即可向现有对象添加新方法,因此无法添加实例变量。
正如您所说,您可以添加使用关联存储保存和加载数据的属性。
如果你有一个类 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 文件中,因此它不会暴露给其他文件,但它在编译时是已知的,因此编译器可以添加所需的实例变量。
【讨论】: