为什么我不能@synthesize类别中的访问者?

时间:2009-05-18 17:56:11

标签: objective-c

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

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

2 个答案:

答案 0 :(得分:9)

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

由于这种实现,类别本身无法访问类的存储,因此无法对其进行修改(这也打开了在卸载类别时该怎么做的问题。)

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

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

答案 1 :(得分:0)

这里提出的问题涵盖了私人访问者问题。这取决于非私人访问者POV。