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 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 对上面的代码没有给出警告或错误。

4

2 回答 2

0

从 Xcode 4.4 开始,属性是自动合成的。如果您声明了一个可读写的属性并且您没有为该属性实现 getter 和 setter 方法,Xcode 将@synthesize property = _property自动为您插入。对于只读属性,您不能实现 getter 方法来获取此行为。

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

于 2012-08-15T16:40:31.723 回答
0

在 Xcode 4.4 中,默认情况下会合成属性。因此,通过省略自己的综合,编译器会为您完成!

请参阅 Apple 文档- 特别是“编译器默认为未实现的 @properties 自动调用 @synthesize。”

于 2012-08-15T16:40:33.230 回答