在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中給出了上面的代碼中沒有警告或錯誤。
是的,Xcode的確如你所說。不勝感激! – 2012-08-15 18:44:18
我認爲這不是Xcode的版本,而不是底層編譯器的版本(功能),LLVM-clang。 – 2012-08-15 22:10:12
你是對的H2CO3,但我想盡可能簡單地回答這個問題。 ;) – 2012-08-16 06:42:07