我在用着AppCode
它标记了一个非常大的项目代码中的一个有趣的情况。预ARC。
子类定义并合成一个称为委托的属性。实际上属性声明已经被注释掉了!但是@synthesize delegate = delegate_;
声明被留下了。
该代码可以编译,大概是因为基类定义并合成了一个也称为委托的属性,并将其与同名的支持变量合成:@synthesize delegate = delegate_;
我的问题是:将消息发送给代表会发生什么情况
a) 基类方法和
b) 在子类方法中。
AppCode
将子类中的综合语句标记为错误:
属性“delegate”的评估器已与实例变量“delegate”合成
The @synthesize
指令是根据同名属性的规范(原子性、内存管理)创建访问器方法和 ivar 的简写。鉴于此,在子类中重新合成属性(无需重新声明)的工作方式与重写访问器方法完全相同 - 使用子类的实现而不是超类的实现。由于这两种情况下的实现都是由编译器创建的,因此行为上没有明显的差异。
唯一的区别是合成的 ivar 与 a 具有相同的可见性@private
ivar,因此子类无法访问它,包括将其用作属性的支持变量。这意味着子类中的重新合成必须使用不同的ivar名称。如果超类有@synthesize wildHorses = wildHorses_;
,那么编译器要求子类做类似的事情@synthesize wildHorses = equusFerus;
.*
*如果超类使用创建的ivar的默认名称,@synthesize wildHorses;
那么子类仍然必须合成一个新变量:@synthesize wildHorses = wildHorses_;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)