我正在使用AppCode它并在一个非常大的项目的代码中标记了一个有趣的情况.弧前.
子类定义并合成一个名为delegate的属性.实际上财产声明已经被注释掉了!但@synthesize delegate = delegate_;声明被遗忘了.
代码编译,可能是因为基类定义并合成了一个也称为委托的属性,并将其与具有相同名称的后备变量合成: @synthesize delegate = delegate_;
我的问题是:将消息发送给代理人
a)基类方法和
b)在子类方法中.
AppCode 将子类中的synthesize语句标记为错误:
属性'委托'的访问者已经与实例变量'delegate_'合成
该@synthesize指令是根据同名属性的规范(原子性,内存管理)创建访问器方法和ivar的简写.鉴于此,重新合成子类中的属性(不重新声明它)就像覆盖访问器方法一样 - 使用子类的实现而不是超类.由于实现是由编译器在两种情况下创建的,因此行为没有明显的差异.
一个区别是合成的ivar具有与ivar相同的可见性@private,因此子类无法访问它,包括将其用作属性的后备变量.这意味着子类中的重新合成必须使用不同的ivar名称.如果超类有@synthesize wildHorses = wildHorses_;,那么编译器需要子类做类似的事情@synthesize wildHorses = equusFerus;.*
*如果超类使用创建的ivar的默认名称,@synthesize wildHorses;则子类仍必须合成一个新变量:@synthesize wildHorses = wildHorses_;