【问题标题】:Why can't I @synthesize accessors in a category?为什么我不能 @synthesize 类别中的访问器?
【发布时间】:2009-05-18 17:56:10
【问题描述】:

Obj-C 2.0 允许我在类别中声明属性,但编译器拒绝在类别内合成访问器。为什么?

(有时将一堆相关的东西放在一个类别中是有组织意义的 - 即使支持 iVar 进入类声明。我知道类扩展以及如何做私有属性,但这不是我的用途情况。)

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    问题在于类别在逻辑上与其类是分开的,甚至单独存储在二进制文件中。内部实现是类描述结构包含一个方法列表数组,该数组最初仅包含在主@implementation 块中定义的方法列表。随着 ObjC 链接器模块加载新类别,它们的方法列表被添加到该数组中。

    由于这种实现,类别本身无法访问类的存储,因此无法修改它(它还引发了当类别被卸载时该怎么做的问题)。

    最后,从更合乎逻辑而非技术的角度来看,这个想法是类别对类的内存结构没有任何“所有权”,它只是关联了一些新方法。为了完全支持属性合成,它需要以某种方式修改类的存储

    解决方案?您可以将@synthesize 语句放在主@implementation 块中,或者直接在@implementation 类别中实现自己的访问器。

    【讨论】:

    • 让我说得更具体一些。出于组织目的,我将一些方法划分为一个类别,并且由于我拥有该类,因此我在类接口中添加了适当的 iVar。但我仍然无法@synthesize 类别中的方法。为什么不这样做有技术原因吗?我还没有看到。
    • 这并没有太大的不同。您是类和类别的作者这一事实并没有以任何方式由运行时编码,因此类别仍然只是一个单独的实体,与它所引用的类的存储说明符没有任何联系。就像我说的,它是一种“保护”机制——你只需要 @synthesize 类的主 @implementation 块内的变量(这对我来说很好)。
    【解决方案2】:

    那里提出的问题涵盖了私有访问器问题。这种方法来自非私有访问者 POV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2012-06-17
      • 2014-12-15
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多