为什么要使用@synthesize语句

Rog*_*are 2 properties objective-c ios

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

@synthesize myProperty=_myProperty
Run Code Online (Sandbox Code Playgroud)

但是,这似乎是一段时间的默认行为.因此,省略此语句与将其保留完全相同.

我的问题是:给定这个默认行为,我们实际上想要使用@synthesize语句的一些实际示例是什么?

Sul*_*han 6

在iOS 6中,LLVM编译器带有一种称为"属性自动合成"的东西.基本上,这意味着编译器将按以下形式@synthesize@property它看到的每一个添加一个:

@synthesize propertyName = _propertyName;
Run Code Online (Sandbox Code Playgroud)

也就是说,它将创建一个前缀为下划线的ivar,它将使用此ivar生成getter和setter.

@synthesize显式使用只有一个原因,原因是重命名ivar,或者,例如,对两个不同的属性使用相同的ivar.

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

自动合成没有记忆含义,因此根本不与ARC连接.

如果我手动实现getter和setter怎么办?

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

编辑

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