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

Posted

技术标签:

【中文标题】Objective-C 是 @synthesize 是必需的还是可选的?【英文标题】:Objective-C is @synthesize required or optional? 【发布时间】:2013-03-25 01:06:49 【问题描述】:

对不起,我是一个新手 ios 开发人员,最近我听说 @synthesize 现在在某个 Xcode 版本中是 @synthesize 并且编译器会自动合成和属性并将 _ 分配给私有变量。

我已经测试过了:

没有@synthesize,您可以使用

访问属性和私有字段
self.property_name = something;
_property_name = something; //(used in getter and setters)

使用@synthesize property_name,您可以使用

访问属性和私有字段
self.property_name = something;
property_name = something;

我的问题是我们真的需要@synthesize 了吗?还是我错过了一个更大的故事?

【问题讨论】:

如果您在大多数情况下不使用@synthesize,最新版本的编译器将为您提供。我刚刚在这里写了关于属性的文章:***.com/questions/15493882/… 见***.com/questions/11666008/… 取决于月相,更重要的是,您使用的是哪个版本的 Xcode。 【参考方案1】:

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

简单地说,它会自动生成:

@synthesize name = _name;

【讨论】:

警告:如果你覆盖所有自动生成的方法,这一行将不会自动生成(但你仍然可以自己编写来获取变量)。此外,协议中定义的属性不会自动合成(相反,您会收到编译器警告)。最后,NSManagedObject 的子类也禁用了这种行为,因为它在很大程度上是不受欢迎的。 这个答案简单地说。有关详细信息,请阅读此帖子:Automatic Property Synthesis With Xcode 4.4 另一个警告:如果您在协议中声明了属性,它们将需要合成。 所以你只需要/必须在你想重命名标题中声明的属性时使用它。【参考方案2】:

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

在.h中:

@property int32_t FwdID;

在.m:

@synthesize FwdID;

类内使用:

FwdID = 0;

据我所知,如果您希望使用默认值,您必须输入 _FwdID = 0;在代码中,这对我来说看起来很丑。

所以如果你像我一样(打破了我假设的所有标准编码约定),你仍然需要使用综合。

【讨论】:

你应该通过 getter 和 setter [self setFwdID:0]; 访问属性,否则使用真实的实例变量而不是属性。

以上是关于Objective-C 是 @synthesize 是必需的还是可选的?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C中的@property和@synthesize用法

Objective-c 中的 @property 和 @synthesize

Objective-C中的@property和@synthesize用法

Objective-C基础笔记@property和@synthesize

Objective-C基础之@synthesize, @dynamic

Objective-C中.h文件.m文件中@interface@synthesize及其它