[英]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.