繁体   English   中英

在iOS中合成CGFloat属性

[英]Synthesizing CGFloat property in iOS

我宣布了一个属性如下。 从我在网上的阅读中,我不清楚我是否也应该合成如下。 我见过支持两种不同方法的博客文章。

@property (assign, nonatomic) CGFloat someFloat;

然后在实施中:

@synthesize someFloat = _someFloat;

在某些情况下我也看到过:

@synthesize someFloat;

根据读数,我理解“someFloat”是属性名称,“_someFloat”是通过综合创建的。 所以我认为第一种方式是正确的。 但是,我使用第二种方法没有问题。 我在其他代码和博客中看到了第二种方法。

有人能告诉我什么是正确的方法和原因?

通常,您不再需要手动编写@synthesize 在你的例子中,如果你写

@property (assign, nonatomic) CGFloat someFloat;

编译器会自动为你合成它,这相当于你写的

@synthesize someFloat = _someFloat;

因此,你就可以通过访问属性self.someFloat或使用实现文件中访问伊娃_someFloat

但是,如果您手动合成它,就像

@synthesize someFloat;

编译器会自动创建一个名为someFloat的支持ivar ...因此,你仍然可以通过getter self.someFloat访问变量(也就是说,相当于[self someFloat]调用)。

或者,你可以通过在实现中的某个地方使用someFloat来访问ivar ...

一般来说,不建议像这样合成,因为当你打算使用getter访问变量时,很容易意外地使用ivar。

除了规则之外

然而,在某些情况下,编译器有时会混淆合成变量。 例如,如果你有一个类是NSManagedObject的子NSManagedObject ,那么你仍然需要手动编写 @synthesize (当然,假设你实际上想要合成属性......你可能不会... )。

原因有两方面:(1)编译器似乎还没有很好地理解这些属性(或者至少在我使用的情况下没有),以及(2)很多次,你其实并不@synthesize上的性能NSManagedObject子......相反,你想他们是@dynamic而不是(这样的getter / setter将在运行时产生的,每个要求NSManagedObject子类魔法)。

只需跳过@synthesize语句,编译器将生成与您具有相同的内容:

@synthesize someFloat = _someFloat;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM