2010-09-17 82 views
3

我注意到,你可以“双声明”这样一个变量:属性和实例变量声明

@interface A { 
    NSString *instanceVariable; 
} 
@property (nonatomic, retain) NSString *instanceVariable; 
@end 

这有只是做同样的效果:

@interface A { 
} 
@property (nonatomic, retain) NSString *instanceVariable; 
@end 

为什么不编译器在这样的情况下抱怨?

回答

7

因为两种方式都是有效的。

通过刚刚宣布一个属性声明伊娃它可用的新语言功能开始objc 2.0

在“Objective-C编程语言” "Run-time differences"部分参考指出:

对于@synthesize到在传统的 运行时中,您必须提供一个 实例变量,其名称与 相同,并且兼容类型的属性或 在@synthesize st中指定另一个现有实例 变量atement。 使用现代运行时,如果您不提供实例变量,则 编译器会为您添加一个实例变量。

+0

...试图找到证明链接:) – Vladimir 2010-09-17 15:31:23

+1

请参阅[here](http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW9)... * “对于现代运行时[...],实例变量根据需要进行合成,如果已经存在相同名称的实例变量,则使用它。”* – 2010-09-17 15:34:44

+0

感谢您的回答。 – 2010-09-17 15:59:19