为什么要使用@synthesize 语句

Why use @synthesize statements

当我第一次学习 iOS 编程时(我相信这是来自斯坦福大学 ARC 之前的讲座),我们总是综合这样的属性:

@synthesize myProperty=_myProperty

但是,这似乎已经 default behaviour 有一段时间了。因此,省略此语句与保留它完全相同。

我的问题是:鉴于此默认行为,有哪些实际示例我们实际上想在其中使用@synthesize 语句?

您不必使用它。 只需在 .h 中像这样声明 public 属性:

@property (nonatomic, strong/weak/assign) MyType *propertyName;

关于 ARC 的更多详细信息here

补充说明:
@synthesize 用于 link 带有内部 class 变量的 属性。使用 ARC 自动完成。

@synthesize in objective-c 只是实现了 属性 setters 和 getters:

- (void)setCoolWord:(NSString *)coolWord {
     _coolWord = coolWord;
}

- (NSString *)coolWord {
    return _coolWord;
}

Xcode 4 确实为您实现了这一点(iOS6 需要 Xcode 4)。从技术上讲,它实现了@synthesize coolWord = _coolWord(_coolWord 是实例变量,coolWord 是 属性)。

要访问这些属性,请使用 self.coolWord 两者都用于设置 self.coolWord = @"YEAH!";并获得 NSLog(@"%@", self.coolWord);

另请注意,setter 和 getter 仍然可以手动实施。如果您同时实施 setter 和 getter,尽管您还需要手动包含 @synthesize coolWord = _coolWord;

通过 iOS6 中的自动合成,不再需要专门声明支持 ivars 或编写 @synthesize 语句。当编译器找到 @属性 语句时,它将使用我们刚刚回顾的指南代表我们完成这两项工作。 所以我们需要做的就是像这样声明一个 属性 :

@property (nonatomic, strong) NSString *abc;

而在iOS6中,@synthesize abc = _abc,会在编译时自动加上。

对于 iOS 6,LLVM 编译器附带了一个叫做 "property autosynthesis" 的东西。基本上,这意味着编译器会为它看到的每个 @property 添加一个 @synthesize,格式如下:

@synthesize propertyName = _propertyName;

也就是说,它将创建一个带有下划线前缀的ivar,并使用这个ivar生成getter & setter。

明确使用 @synthesize 的原因只有一个,原因是重命名 ivar,或者,例如,为两个不同的属性使用相同的 ivar。

另请注意,在某些情况下您需要使用@dynamic来防止合成。通常当您知道方法(getter 或 setter)已经在某处定义但编译器不知道它们时。

自动合成没有内存影响,因此它根本没有连接到 ARC。

What if I manually implement getter and a setter?

如果 属性 是可读写的并且您实现了 setter 和 getter,或者如果 属性 是只读的并且您实现了 getter,那么什么都不会合成。综合指的是两种方法的自动定义。为什么编译器要合成已经存在的东西?如果手动实现需要一个ivar,只需声明ivar,你不需要添加@synthesize只是为了添加一个ivar(尽管你可以)。

编辑

我忘记了一个需要使用 @synthesize 的原因,那就是在实现协议中声明的 属性 时。这样的 属性 不会被自动合成。一个典型的例子是[UIApplicationDelegate window].