我的印象是,Objective C 中的类扩展只是匿名类别。但是,你可以为这些类扩展添加属性,这在类别中是不可能的,所以我有点困惑:
#import "Money.h"
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Money
@end
类扩展是如何实现的?作为类别?那你为什么允许向它添加 iVars 呢?何时将类扩展添加到类中,在编译时或在加载类时?
我的印象是,Objective C 中的类扩展只是匿名类别。但是,你可以为这些类扩展添加属性,这在类别中是不可能的,所以我有点困惑:
#import "Money.h"
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Money
@end
类扩展是如何实现的?作为类别?那你为什么允许向它添加 iVars 呢?何时将类扩展添加到类中,在编译时或在加载类时?
类扩展是一种编译器机制,它允许将声明的实例变量、声明的属性和方法的子集偏移@interface
到特定的翻译单元(例如,从公共头文件到实现文件),从而允许头文件仅声明应该是公开的。从运行时的角度来看,扩展并不存在:类扩展中声明的所有内容都合并到主体类中。这意味着扩展必须沿着其主体类(而不是类别)编译,您可以从@implementation
主体类及其扩展都有一个单一的事实推断出这一点。这都是同一个班级的一部分。
如您所见,类扩展与类别完全不同。类别不能声明实例变量,类别可以驻留在与实现主体类(包括在库中声明和实现的类)不同的实现文件中,并且它们有自己的@implementation
. 此外,类别由运行时显式加载并附加到主体类。