3

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

一个子类定义并综合了一个称为委托的属性。实际上属性声明已经被注释掉了!但该@synthesize delegate = delegate_;声明被抛在了脑后。

代码可以编译,大概是因为基类定义并合成了一个也称为委托的属性,并将其与同名的支持变量合成:@synthesize delegate = delegate_;

我的问题是:消息会发生什么被发送给代表

a) 基类方法和

b) 在子类方法中。

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

属性“delegate”的访问器已经与实例变量“delegate_”合成

4

1 回答 1

5

@synthesize指令是根据同名属性的规范(原子性、内存管理)创建访问器方法和 ivar 的简写。鉴于此,重新合成子类中的属性(无需重新声明)的工作方式与覆盖访问器方法完全相同——使用子类的实现而不是超类的实现。由于这两种情况下的实现都是由编译器创建的,因此在行为上没有明显差异。

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


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

于 2012-05-21T18:36:17.820 回答