我宣布了一个属性如下。从我在网上的阅读中,我不清楚我是否也应该合成如下。我见过支持两种不同方法的博客文章。
@property (assign, nonatomic) CGFloat someFloat;
然后在实施中:
@synthesize someFloat = _someFloat;
在某些情况下我也看到了:
@synthesize someFloat;
从读数来看,我理解“someFloat”是属性名称,“_someFloat”是通过综合创建的。所以我认为第一种方式是正确的。但是,我使用第二种方法没有问题。我在其他代码和博客中看到了第二种方法。
有人可以告诉我这是正确的方法和原因吗?
答案 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;