【发布时间】:2009-05-18 17:56:10
【问题描述】:
Obj-C 2.0 允许我在类别中声明属性,但编译器拒绝在类别内合成访问器。为什么?
(有时将一堆相关的东西放在一个类别中是有组织意义的 - 即使支持 iVar 进入类声明。我知道类扩展以及如何做私有属性,但这不是我的用途情况。)
【问题讨论】:
标签: objective-c
Obj-C 2.0 允许我在类别中声明属性,但编译器拒绝在类别内合成访问器。为什么?
(有时将一堆相关的东西放在一个类别中是有组织意义的 - 即使支持 iVar 进入类声明。我知道类扩展以及如何做私有属性,但这不是我的用途情况。)
【问题讨论】:
标签: objective-c
问题在于类别在逻辑上与其类是分开的,甚至单独存储在二进制文件中。内部实现是类描述结构包含一个方法列表数组,该数组最初仅包含在主@implementation 块中定义的方法列表。随着 ObjC 链接器模块加载新类别,它们的方法列表被添加到该数组中。
由于这种实现,类别本身无法访问类的存储,因此无法修改它(它还引发了当类别被卸载时该怎么做的问题)。
最后,从更合乎逻辑而非技术的角度来看,这个想法是类别对类的内存结构没有任何“所有权”,它只是关联了一些新方法。为了完全支持属性合成,它需要以某种方式修改类的存储
解决方案?您可以将@synthesize 语句放在主@implementation 块中,或者直接在@implementation 类别中实现自己的访问器。
【讨论】:
那里提出的问题涵盖了私有访问器问题。这种方法来自非私有访问者 POV。
【讨论】: