更新 - 许多人坚持我需要为该属性声明一个 iVar。有些人说不是这样,因为我使用的是现代运行时(64 位)。我可以确认几个月来我已经成功地使用了没有 iVars 的 @property。因此,我认为“正确”的答案是对为什么在 64 位上我突然必须在(且仅当)我要从子类访问它时显式声明 iVar 的解释。到目前为止,我看到的唯一一个可能是 GCC 错误(感谢 Yuji)。毕竟不是那么简单......为了澄清可能的错误是:当从基类继承时,如果孩子也碰巧在访问 iVar 之前使用 @synthesize 实现了一个 UNRELATED 访问器,则孩子无法访问父母的 iVar。
几个小时以来,我一直在为此挠头——我没有过多地使用继承。
在这里,我设置了一个简单的 Test B 类,它继承自 Test A,其中声明了 ivar。但是我得到了变量未声明的编译错误。这只发生在我添加属性和综合声明时 - 没有它们也能正常工作。
测试头:
#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
NSString *testString;
}
@end
TestA 实现为空:
#import "TestA.h"
@implementation TestA
@end
测试B标头:
#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface TestB : TestA {
}
@property (nonatomic, retain) NSString *testProp;
@end
TestB 实现(错误 - 'testString' 未声明)
#import "TestB.h"
@implementation TestB
@synthesize testProp;
- (void)testing{
NSLog(@"test ivar is %@", testString);
}
@end