即使没有@synthesize,我也可以在实现中使用声明的属性。这是设计的吗?

时间:2012-08-15 16:34:49

标签: objective-c xcode cocoa-touch

在Hello World教程中,我试图注释掉'@synthesize userName = _userName;'在HelloWorldViewController.m文件中。根据{{​​3}},“...你使用@synthesize指令告诉编译器如果你没有在@implementation块中提供它们,它应该为属性合成setter和/或getter方法。” / p>

对我来说奇怪的是,即使使用'@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没有给出上述代码的警告或错误。

2 个答案:

答案 0 :(得分:0)

从Xcode 4.4开始,属性会自动合成。如果声明一个readwrite属性而没有为该属性实现getter和setter方法,Xcode将自动为您插入@synthesize property = _property。对于只读属性,您不得实现getter方法来获得此行为。

如果你实现了setter和/或getter方法,Xcode将不会自动合成属性,也不会为你创建一个iVar。在这种情况下,您仍然可以自己添加@synthesize

答案 1 :(得分:0)

在Xcode 4.4中,默认情况下会合成属性。因此,通过省略自己的合成,编译器会为你做到这一点!

See Apple docs - 特别是“编译器默认为未实现的@properties自动调用@synthesize。”