Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么不';属性自动合成_Objective C_Properties - Fatal编程技术网

Objective c 为什么不';属性自动合成

Objective c 为什么不';属性自动合成,objective-c,properties,Objective C,Properties,也许这是个愚蠢的问题。每次我创建一个@属性时,我都必须对它进行@合成。但是这没有任何意义使用@property(无论什么)类型*属性只能在实现文件中执行@synthesis属性。那么为什么两者都需要呢?为什么编译器不自动生成getter/setter方法而无需我编写@synthesis属性这只是历史上的事情,所以当前编译器需要这样做。在XCode 4中,不再需要这些@synthesis(根据WWDC视频,希望我没有违反NDA).@synthesis不是唯一的选项@动态属性也是可能的。@synth

也许这是个愚蠢的问题。每次我创建一个
@属性
时,我都必须对它进行
@合成。但是这没有任何意义使用
@property(无论什么)类型*属性
只能在实现文件中执行
@synthesis属性
。那么为什么两者都需要呢?为什么编译器不自动生成getter/setter方法而无需我编写
@synthesis属性

这只是历史上的事情,所以当前编译器需要这样做。在XCode 4中,不再需要这些@synthesis(根据WWDC视频,希望我没有违反NDA).

@synthesis
不是唯一的选项<代码>@动态属性
也是可能的。

@synthesis不是唯一的选项;还有@dynamic,这意味着您将自己实现这些方法。[已编辑;有关更多详细信息,请参见bbum的答案。]

在当前的生产编译器中,默认情况下(不带
@synthesis
)是不执行任何操作,然后在未提供实现时发出警告


@synthesis
在最新版本的LLVM 2.0编译器中是自动的

自己实现setter/getter时,不需要
@dynamic
<代码>@dynamic在运行时动态提供实现时使用。也就是说,
@dynamicfoo
@property foo组合-foo
-setFoo:
实现,则code>将导致编译器不发出警告

请注意,您还可以使用
@synthesis-propertyName=instanceVariableName
使用特定的、命名不同的实例变量作为备份存储

接口中的
@property
是getter/setter方法声明的缩写。它还携带了编译器在
@synthesis
期间利用的更多元数据(保留、分配等)


而且,像往常一样,
原子属性对线程安全没有真正的帮助。

从Xcode 4.4开始,现在就是这样。不再明确要求合成。

进一步讨论差异:谢谢。尽管如此,我还是觉得很奇怪。如果我自己实现getter和setter,我就可以将函数定义复制到头文件中,而无需使用@property声明。:)这个答案通常是正确的,但有许多细节是错误的。请看我的答案。如果添加@dynamic,最好不要收到编译器警告!这就是重点!(检查)并且,实际上,您不会得到编译器警告。当然,如果不动态注入实现,您会遇到运行时异常。@bbum我不知道我在写(现在已删除)注释时是怎么想的。谢谢,我不知道动态。您也可以自己实现getter/setter。