我如下声明了一个属性。从我在网上的阅读来看,不清楚我是否也应该综合如下。我看到过支持博客文章的两种不同方法。
@property (assign, nonatomic) CGFloat someFloat;
然后在实现中:
@synthesize someFloat = _someFloat;
我在某些情况下也看到:
@synthesize someFloat;
从阅读中,我了解到"someFloat"是一个属性名称,"_someFloat"是通过合成创建的。所以我觉得第一种方式是正确的。然而,我毫无问题地使用了第二种方法。我在其他代码和博客中看到了第二种方法。
有人能告诉我什么是正确的方法吗?为什么
通常,您不再需要手动编写@synthesize
。在您的示例中,如果您编写
@property (assign, nonatomic) CGFloat someFloat;
编译器会自动为您合成它,这相当于您编写
@synthesize someFloat = _someFloat;
因此,您可以通过self.someFloat
访问属性,也可以使用_someFloat
访问实现文件中的ivar。
然而,如果你像一样手动合成它
@synthesize someFloat;
编译器自动创建一个名为someFloat
的后台ivar。。。因此,您仍然可以通过getter self.someFloat
访问变量(也就是说,相当于[self someFloat]
调用)。
或者,您可以通过在实现中的某个位置简单地使用someFloat
来访问ivar。。。
一般来说,不建议这样合成,因为当您打算使用getter访问变量时,很容易意外使用ivar。
规则例外
然而,在某些情况下,编译器有时仍会与合成变量混淆。例如,如果你有一个NSManagedObject
的子类,那么你仍然需要手动编写@synthesize
(当然,假设你真的想合成这个属性……你可能不想…)
原因有两个:(1)编译器似乎还没有很好地理解这些属性(或者至少在我处理过的情况下没有),以及(2)很多时候,你实际上不想在NSManagedObject
子类上使用@synthesize
属性。。。相反,您希望它们是@dynamic
(因此getter/setter将根据NSManagedObject
子类magic的要求在运行时生成)。
只要跳过@synthesize
语句,编译器就会生成与您有相同的东西:
@synthesize someFloat = _someFloat;