在iOS中合成CGFloat属性



我如下声明了一个属性。从我在网上的阅读来看,不清楚我是否也应该综合如下。我看到过支持博客文章的两种不同方法。

@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;

最新更新