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_Cocoa_Categories_Class Extensions_Ivars - Fatal编程技术网

Objective c 类扩展中的属性何时添加到目标C中的类?

Objective c 类扩展中的属性何时添加到目标C中的类?,objective-c,cocoa,categories,class-extensions,ivars,Objective C,Cocoa,Categories,Class Extensions,Ivars,我的印象是,Objective C中的类扩展只是匿名类别。但是,您可以向这些类扩展添加属性,这在类别中是不可能的,因此我有点困惑: #import "Money.h" @interface Money () @property(nonatomic) NSUInteger amount; @end @implementation Money @end 类扩展是如何实现的?作为类别?那么,为什么允许您在其中添加IVAR?类扩展是什么时候添加到类中的,是在编译时还是在加载类时?类扩展是一种编译

我的印象是,Objective C中的类扩展只是匿名类别。但是,您可以向这些类扩展添加属性,这在类别中是不可能的,因此我有点困惑:

#import "Money.h"

@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

@implementation Money

@end

类扩展是如何实现的?作为类别?那么,为什么允许您在其中添加IVAR?类扩展是什么时候添加到类中的,是在编译时还是在加载类时?

类扩展是一种编译器机制,允许将
@interface
中声明的实例变量、声明的属性和方法的子集偏移到特定的转换单元(例如,从公共头文件到实现文件),从而允许头文件仅声明应该是公共的内容。从运行时的角度来看,扩展不存在:类扩展中声明的所有内容都合并到主体类中。这意味着扩展必须沿其主体类进行编译(与categories相反),您可以从这样一个事实中推断出来,即主类及其扩展都有一个
@implementation
。它都是同一个类的一部分


正如您所看到的,类扩展与类别有很大的不同。类别不能声明实例变量,类别可以驻留在与实现主体类的实现文件不同的实现文件中(包括在库中声明和实现的类)它们有自己的
@实现
。此外,运行时会显式加载类别并将其附加到主类。

谢谢,现在有意义了。:-)您介意看看这个相关问题吗?您回来了!!这太棒了!