我注意到你可以用这种方式'双重声明'变量:
@interface A {
NSString *instanceVariable;
}
@property (nonatomic, retain) NSString *instanceVariable;
@end
这与以下情况具有相同的效果:
@interface A {
}
@property (nonatomic, retain) NSString *instanceVariable;
@end
为什么编译器在这种情况下不抱怨?
答案 0 :(得分:7)
因为两种方式都有效。
通过声明属性来声明ivar是一种新的语言功能,可以从objc 2.0开始
在“Objective-c编程语言”的"Run-time differences"部分中提到:
让@synthesize在遗产中工作 运行时,你必须提供一个 具有相同名称的实例变量 和兼容的财产类型或 指定另一个现有实例 @synthesize语句中的变量。 使用现代运行时,如果不这样做 提供一个实例变量, 编译器为你添加一个。