1

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

@property (assign, nonatomic) CGFloat someFloat;

然后在实现中:

@synthesize someFloat = _someFloat;

在某些情况下,我也看到过:

@synthesize someFloat;

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

有人可以告诉我正确的方法是什么,为什么?

4

2 回答 2

3

一般来说,您不再需要手动编写@synthesize。在你的例子中,如果你写

@property (assign, nonatomic) CGFloat someFloat;

编译器会自动为你合成,相当于你写

@synthesize someFloat = _someFloat;

因此,您将能够通过使用来访问属性self.someFloat或访问实现文件中的 ivar _someFloat

但是,如果您像这样手动合成它

@synthesize someFloat;

编译器会自动创建一个名为someFloat... 的支持 ivar,因此,您仍然可以通过 getter 访问该变量self.someFloat(即相当于[self someFloat]调用)。

someFloat或者,您可以通过简单地使用实现中的某处来访问 ivar ...

一般来说,不建议这样合成,因为当您打算使用 getter 访问变量时,很容易意外使用 ivar。

规则的例外

然而,在某些情况下,编译器有时仍会对综合变量感到困惑。例如,如果您有一个是 的子类的类,那么NSManagedObject您仍然需要@synthesize手动编写(当然,假设您实际上想要合成该属性......但您可能不会......)。

这样做的原因有两个:(1)编译器似乎还没有很好地理解这些属性(或者至少在我使用过的情况下它没有),以及(2)很多次,您实际上不想在子类上设置@synthesize属性NSManagedObject......相反,您希望它们是@dynamic(因此 getter/setter 将在运行时根据NSManagedObject子类魔法的要求生成)。

于 2013-02-18T02:50:32.507 回答
1

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

@synthesize someFloat = _someFloat;
于 2013-02-18T02:50:47.487 回答