一般来说,您不再需要手动编写@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
子类魔法的要求生成)。