iOS:不明确的属性合成行为.与继承有关

Sea*_*mus 3 objective-c ios

我正在使用AppCode它并在一个非常大的项目的代码中标记了一个有趣的情况.弧前.

子类定义并合成一个名为delegate的属性.实际上财产声明已经被注释掉了!但@synthesize delegate = delegate_;声明被遗忘了.

代码编译,可能是因为基类定义并合成了一个也称为委托的属性,并将其与具有相同名称的后备变量合成: @synthesize delegate = delegate_;

我的问题是:将消息发送给代理人

a)基类方法和

b)在子类方法中.

AppCode 将子类中的synthesize语句标记为错误:

属性'委托'的访问者已经与实例变量'delegate_'合成

Jos*_*ell 5

@synthesize指令是根据同名属性的规范(原子性,内存管理)创建访问器方法和ivar的简写.鉴于此,重新合成子类中的属性(不重新声明它)就像覆盖访问器方法一样 - 使用子类的实现而不是超类.由于实现是由编译器在两种情况下创建的,因此行为没有明显的差异.

一个区别是合成的ivar具有与ivar相同的可见性@private,因此子类无法访问它,包括将其用作属性的后备变量.这意味着子类中的重新合成必须使用不同的ivar名称.如果超类有@synthesize wildHorses = wildHorses_;,那么编译器需要子类做类似的事情@synthesize wildHorses = equusFerus;.*


*如果超类使用创建的ivar的默认名称,@synthesize wildHorses;则子类仍必须合成一个新变量:@synthesize wildHorses = wildHorses_;