2012-08-15 25 views
0

在Hello World教程中,我試圖將'@synthesize userName = _userName;'註釋掉在HelloWorldViewController.m文件中。根據https://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1,「...您使用@synthesize指令告訴編譯器,如果您不在@implementation塊中提供它們,它應該爲屬性合成setter和/或getter方法。」即使沒有@synthesize,我也可以在實現中使用聲明的屬性。這是設計嗎?

對我來說很奇怪的是,即使'@synthesize userName = _userName;'註釋掉,HelloWorldViewController.m文件中語句的後期出現,例如[self.userName length]和self.userName = [[self textField] text],不被認爲是Xcode的錯誤或警告(我是在V4.4.1上)。這怎麼可能?

據我所知,如果聲明的屬性缺少@synthesize,該屬性甚至沒有定義。更重要的是,@synthesize意味着沒有getter或setter方法來實現這個屬性。 Hello World應用程序如何編譯並運行完美?代碼

部分是在這裏:

#import "HelloWorldViewController.h" 
@implementation HelloWorldViewController 
//@synthesize userName = _userName; 
@synthesize label; 
@synthesize textField; 

... 

- (IBAction)changeGreeting:(id)sender { 

[self setUserName:[[self textField] text]]; 

if([self.userName length]==0){ 
    [self setUserName: @"World"]; 
} 
NSString *greeting=[[NSString alloc] initWithFormat:@"Hello, %@!", self.userName]; 
self.label.text=greeting; 

- (IBAction)changeGreeting:(id)sender { 

self.userName = [[self textField] text]; 

if([self.userName length]==0){ 
    [self setUserName: @"World"]; 
} 
NSString *greeting=[[NSString alloc] initWithFormat:@"Hello, %@!", self.userName]; 
self.label.text=greeting; 

} 

@end 

Xcode中給出了上面的代碼中沒有警告或錯誤。

回答

0

從Xcode 4.4開始,屬性自動合成。如果你聲明一個屬性是readwrite,而你沒有實現該屬性的getter和setter方法,Xcode會自動爲你插入@synthesize property = _property。對於只讀屬性,您不得實現getter方法來獲取此行爲。

如果您實現setter和/或getter方法,Xcode將不會自動綜合屬性,也不會爲您創建iVar。在這種情況下,你仍然可以自己添加@synthesize

+0

是的,Xcode的確如你所說。不勝感激! – 2012-08-15 18:44:18

+0

我認爲這不是Xcode的版本,而不是底層編譯器的版本(功能),LLVM-clang。 – 2012-08-15 22:10:12

+0

你是對的H2CO3,但我想盡可能簡單地回答這個問題。 ;) – 2012-08-16 06:42:07

0

在Xcode 4.4中,默認情況下屬性會被合成。因此,通過自己省略合成,編譯器可以爲您做到!

See Apple docs - 具體爲「編譯器自動爲未實現的@properties調用@synthesize。」

+0

非常感謝!這種'異常'的xcode行爲引起了我很多困惑,因爲這個新特性沒有在'Objective-C編程語言'文檔中更新。 – 2012-08-15 18:41:18

相關問題