【问题标题】:When are properties in a class extension added to the class in Objective C?何时将类扩展中的属性添加到 Objective C 中的类中?
【发布时间】:2013-06-19 11:57:46
【问题描述】:

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

#import "Money.h"

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

@implementation Money

@end

类扩展是如何实现的?作为类别?那你为什么允许向它添加 iVars 呢?什么时候在类中添加类扩展,在编译时或加载类时?

【问题讨论】:

    标签: objective-c cocoa categories class-extensions ivars


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2020-03-28
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2013-07-11
    • 2020-11-07
    相关资源
    最近更新 更多