objective-c - iOS:不明确的属性合成行为。继承相关

标签 objective-c ios

我正在使用 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/

相关文章:

ios - 在 Swift 中使用单例和解析 JSON

ios - 如何使用 Mixpanel 为 iOS 分配 AB 测试桶

ios - 核心数据获取返回意外结果

iOS sigabrt 中止崩溃

objective-c - View Controller 内的 View Controller 不会收到旋转消息 - ios

ios - 覆盖 viewDidLoad 中的现有值

ios - 从框架项目进行单元测试时应用程序崩溃

iphone - 在一个类接口(interface)中定义的 obj c 中的结构对其他类不可用

ios - 如何初始化从 NSString 到 NSArray 的字典

ios - 位置更新问题 iOS