Objective-C中的@synthesize是必需还是可选的?

33
抱歉,我是一名新手iOS开发者。最近我听说在某个版本的Xcode中,@synthesize 已经被改成了自动生成,并将属性分配给私有变量_。 我进行了测试:没有使用 @synthesize,你可以使用以下方式访问属性和私有字段:
self.property_name = something;
_property_name = something; //(used in getter and setters)

使用 @synthesize 属性名,可以访问属性和私有字段

self.property_name = something;
property_name = something;

我的问题是我们是否还需要使用 @synthesize 关键字?或者我忽略了更大的故事?


1
如果你在大多数情况下省略了 @synthesize,最新版本的编译器会为你自动添加。我刚写了一篇关于属性的文章,在这里:https://dev59.com/82_Xa4cB1Zd3GeqP5dXy#15494036 - nielsbot
1
请参见 https://dev59.com/6Wgu5IYBdhLWcg3wASSO - rmaddy
2
取决于月相,更重要的是你使用的Xcode版本。 - Hot Licks
2个回答

55

从 Xcode 4.4 开始,我们不需要那样做了,因为它添加了一个名为“Default Synthesis Of Properties”的功能。

简单地说,它会自动生成以下内容:

@synthesize name = _name;

18
注意:如果你覆盖了所有自动生成的方法,那么这行代码将不会被自动生成(但是你仍然可以手动编写它以获取变量)。此外,在协议中定义的属性不会自动合成(而是会得到编译器警告)。最后,由于这是大多数情况下不需要的行为,所以NSManagedObject的子类也会禁用这种行为。 - borrrden
4
这个答案说得太简单了。如果想了解详情,请阅读这篇文章:使用Xcode 4.4自动生成属性合成 - Basil Bourque
3
另一个注意事项:如果您在协议中声明了属性,它们将需要进行合成。 - James Webster
只有在您想要重命名头文件中声明的属性时,才需要使用它。 - Ilker Baltaci

-3

除非你像我一样一直在使用它,否则据我所知,你仍然需要它:

在.h文件中:

@property int32_t FwdID;

在 .m 文件中:
@synthesize FwdID;

在类内使用:

FwdID = 0;

据我所知,如果你想让默认值对你起作用,你就必须在代码中输入“_FwdID = 0;”,但这看起来很丑陋。
所以,如果你和我一样(打破所有标准编码规范),你仍然需要使用synthesize。

你应该通过它们的getter和setter方法来访问属性,例如 [self setFwdID:0];,否则使用真正的实例变量而不是属性。 - Maciej Swic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接