我声明了以下属性。从我在网络上的阅读资料来看,尚不清楚我是否也应按如下所述进行综合。我看到了支持博客文章的两种不同方法。

@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)。

10-06 02:56