【发布时间】:2012-07-15 16:42:13
【问题描述】:
当我在第一种情况下使用@property 和@synthesize 以及@property 和@synthesize 并声明相同的实例变量时有什么区别?因为两者似乎都有效。
【问题讨论】:
标签: objective-c ios
当我在第一种情况下使用@property 和@synthesize 以及@property 和@synthesize 并声明相同的实例变量时有什么区别?因为两者似乎都有效。
【问题讨论】:
标签: objective-c ios
没有区别:将使用您声明的实例变量,并且其 ARC 属性将被您声明的 @property 覆盖。
属性的指定所有权保留在其元数据中,但除非该属性是合成的,否则其含义纯粹是传统的。如果一个属性是合成的,那么关联的实例变量就是这个实例变量,它可能是由@synthesize 声明隐式命名的。 如果关联的实例变量已经存在,则其所有权资格必须等于属性的所有权;否则,将使用该所有权资格创建实例变量。
最好避免为您打算@synthesize 的属性声明实例变量。如果您更喜欢具有 不同 名称的实例变量,则可以使用带有 ivar 名称的 synthesize 语法:
@synthesize myproperty = _myivar;
【讨论】:
_myivar 将其与 myproperty 区分开来,但对于新用户,我会指出您显然想要使用 @synthesize var = _var;(其中ivar 与属性同名,只是前面加下划线)。顺便说一句,根据 WWDC 2012 的视频,@synthesize 语句在未来将是可选的,在这种情况下,编译器将使用前面的下划线为您声明 ivar。
@synthesize 指令,但不够聪明地插入它们。
两者都可以工作 - 但是,在较新的架构上,如果您声明一个属性,则不需要专门声明 iVar,因为它是为您完成的。
这是偏好,真的 - 但是,请确保如果您声明两者,当您直接访问 iVar 或通过 getter 和 setter 时,您会意识到。
【讨论】:
这是个人喜好问题,但我建议不要明确声明 ivars。我在 SO 上看到过人们做过以下事情的情况:
@interface MyClass
{
NSString *var;
}
@property (nonatomic, strong) NSString *var;
@end
然后
@implementation MyClass
@synthesize var = _var;
因此,用户显式声明了一个属性和一个同名的 ivar,但随后合成了生成另一个 ivar 的属性(在此示例中,名称中带有前面的下划线),导致生成了两个 ivar .然后他们想知道为什么他们明确声明的 ivar 不起作用。如果您不显式声明您的 ivar,则不会遇到意外以两个 ivar 结束的问题,因为您碰巧在 ivar 显式声明或 @synthesize 语句中输入错误名称。
只声明属性然后@synthesize ivar 使用另一个名称(通常带有前面的下划线),它是明确的(即如果您忘记引用属性@987654325,您不太可能意外引用您的ivar @ 正确为 self.var) 并且您永远不必担心,例如:
@interface MyClass
@property (nonatomic, strong) NSString *var;
@end
然后
@implementation MyClass
@synthesize var = _var;
【讨论】: