我声明了以下属性。从我在网络上的阅读资料来看,尚不清楚我是否也应按如下所述进行综合。我看到了支持博客文章的两种不同方法。
@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)很多次,您实际上是而不是不想在
@synthesize
子类上使用NSManagedObject
属性...而是,您希望将它们改为@dynamic
(因此,根据NSManagedObject
子类magic的要求,将在运行时生成getter / setter)。