【问题标题】:Objective-C categories doesn't allow to add instance variables [duplicate]Objective-C 类别不允许添加实例变量 [重复]
【发布时间】:2016-09-10 18:55:06
【问题描述】:

我想知道为什么 Objective-C 的类别设计模式设计成我们无法添加实例变量的方式。

而且我也开始知道使用 Objective-C 关联的对象我们可以做到。但我更感兴趣的是它背后的主要原因是什么。

【问题讨论】:

    标签: objective-c properties categories ivar


    【解决方案1】:

    已编辑答案以讨论实例变量而不是属性。

    向对象添加实例变量会改变对象的内存分配,并要求重新编译对象。类别无需重新编译即可向现有对象添加新方法,因此无法添加实例变量。

    正如您所说,您可以添加使用关联存储保存和加载数据的属性。

    编辑:

    如果你有一个类 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 文件中,因此它不会暴露给其他文件,但它在编译时已知的,因此编译器可以添加所需的实例变量。

    【讨论】:

    • 如何演示“向对象添加存储的属性会改变对象的内存分配”。你能给我一个例子吗?感谢您的回复
    • 查看我的答案的编辑。
    • 请正确使用术语。 Objective-C 类别允许您添加属性。它们不允许您添加实例变量。
    • rmaddy,说得好。我将编辑我的答案。
    • 邓肯。谢谢你的简短解释。我理解类别和扩展的概念。我仍然不明白将 ivar 添加到对象后如何更改其内存位置并需要重新编译对象。
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 2014-09-16
    • 2013-08-18
    • 2012-02-02
    • 2013-02-02
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多