Objective-C:覆盖超类getter并尝试访问ivar时的编译器错误

smi*_*org 15 properties objective-c instance-variables ios

我正在开发构建iOS 6应用程序.

我有一个类TDBeam,它继承自超类TDWeapon.

超类TDWeapon在TDWeapon.h文件中声明了@property:

@interface TDWeapon : UIView

@property (nonatomic) int damage;

@end
Run Code Online (Sandbox Code Playgroud)

我没有明确地@synthesize属性,因为我让Xcode自动这样做.

在子类TDBeam中,我覆盖了TDBeam.m文件中的getter:

#import "TDBeam.h"

@implementation TDBeam

- (int)damage {
    return _damage;
}

@end
Run Code Online (Sandbox Code Playgroud)

Xcode按预期自动完成getter方法名称.但是当我尝试引用_damage实例变量(继承自超类)时,我收到编译器错误:

Use of undeclared identifier '_damage'
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?我已经尝试显式添加@synthesize,并更改_damage ivar的名称,但编译器不会"看到"它或来自超类的任何其他ivars.我认为ivars是可见的,可以从子类访问?

Jos*_*ell 21

无论是显式还是自动创建,子类都不会看到合成的ivars :@synthesized实例变量的可见性是什么?由于它们在实现文件中有效声明,因此它们的声明不包含在包含子类的"转换单元"中.

如果你真的想直接访问那个ivar,你必须在子类可以看到它的地方显式地声明它(在它的默认"受保护"形式),例如私有头中超类的类扩展.