在iOS中合成CGFloat属性

时间:2013-02-18 02:45:14

标签: ios properties

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

@property (assign, nonatomic) CGFloat someFloat;

然后在实施中:

@synthesize someFloat = _someFloat;

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

@synthesize someFloat;

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

有人可以告诉我这是正确的方法和原因吗?

2 个答案:

答案 0 :(得分:3)

通常,您不再需要手动编写@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)很多时候,你实际上不要想要@synthesize子类上的NSManagedObject属性......相反,你希望它们成为@dynamic(所以根据{{​​1}}子类魔法的要求,将在运行时生成getter / setter。

答案 1 :(得分:1)

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

@synthesize someFloat = _someFloat;