我正在使用AppCode,它在一个非常大的项目的代码中标记了一个有趣的情况。前弧。
子类定义和合成一个名为委托的属性。实际上,财产声明已经被删除了!但@synthesize delegate = delegate_;的声明被抛在脑后。
代码编译,大概是因为基类定义和合成了一个属性(也称为委托),并使用同名的支持变量( @synthesize delegate = delegate_; )对其进行综合。
我的问题是:将消息发送给
a)基类方法和
( b)在子类方法中。
AppCode将子类中的合成语句标记为错误:
属性‘委托’的
访问器已经用实例变量'delegate_'
合成了
发布于 2012-05-21 18:36:17
@synthesize指令是根据同名属性的规范(原子性、内存管理)创建访问器方法和ivar的缩写。考虑到在子类中重新合成属性(而不重新声明属性)的工作原理就像重写访问器方法--使用子类的实现而不是超类的实现。因为在这两种情况下,实现都是由编译器创建的,所以行为没有明显的区别。
一个不同之处是,合成的ivar具有与@private ivar相同的可见性,因此子类无法访问它,包括将其用作属性的支持变量。这意味着子类中的重新合成必须使用不同的ivar名称。如果超类具有@synthesize wildHorses = wildHorses_;,则编译器要求子类执行类似于@synthesize wildHorses = equusFerus;.*的操作。
*如果超类使用所创建的ivar的默认名称,则@synthesize wildHorses;子类仍然必须合成一个新变量:@synthesize wildHorses = wildHorses_;
https://stackoverflow.com/questions/10689313
复制相似问题