我正在使用 AppCode
,它在一个非常大的项目的代码中标记了一个有趣的情况。 ARC 前。
一个子类定义并综合了一个称为委托(delegate)的属性。实际上属性声明已经被注释掉了!但是 @synthesize delegate = delegate_;
语句被留下了。
代码可以编译,大概是因为基类定义并合成了一个属性,也称为 delegate 并将其与同名的支持变量合成:@synthesize delegate = delegate_;
我的问题是:在
中将消息发送给委托(delegate)会发生什么a) 基类方法和
b) 在子类方法中。
AppCode
将子类中的综合语句标记为错误:
Accessors of property 'delegate' were already synthesized with instance variable 'delegate_'
最佳答案
@synthesize
指令是根据同名属性的规范(原子性、内存管理)创建访问器方法和 ivar 的简写。鉴于此,在子类中重新合成属性(无需重新声明它)的工作方式与覆盖访问器方法完全相同——使用子类的实现而不是父类(super class)的实现。由于在这两种情况下实现都是由编译器创建的,因此在行为上没有明显差异。
一个区别是合成的ivar 与@private
ivar 具有相同的可见性,因此子类不能访问它,包括将它用作属性的支持变量。这意味着子类中的重新合成必须使用不同的ivar名称。如果父类(super class)具有 @synthesize wildHorses = wildHorses_;
,则编译器要求子类执行类似 @synthesize wildHorses = equusFerus;
.*
*如果父类(super class)使用创建的 ivar 的默认名称,@synthesize wildHorses;
那么子类仍然必须合成一个新变量:@synthesize wildHorses = wildHorses_;
关于objective-c - iOS:不明确的属性合成行为。继承相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689313/