1

可能重复:
Objective-C 2.0 中的属性和实例变量

当我在第一种情况下使用@property 和@synthesize 以及@property 和@synthesize 并声明相同的实例变量时有什么区别?因为两者似乎都有效。

4

3 回答 3

2

没有区别:您声明的实例变量将被使用,并且它的 ARC 属性将被您声明的@property.

属性的指定所有权保留在其元数据中,但除非属性是综合的,否则其含义纯粹是传统的。如果一个属性是合成的,那么关联的实例变量是由@synthesize 声明可能隐含地命名的实例变量。如果关联的实例变量已经存在,则其所有权资格必须等于属性的所有权;否则,将使用该所有权资格创建实例变量。

@synthesize最好避免为您打算使用的属性声明实例变量。如果您更喜欢具有不同名称的实例变量,则可以使用带有 ivar 名称的 synthesize 语法:

@synthesize myproperty = _myivar;
于 2012-07-16T19:18:21.947 回答
1

两者都可以工作 - 但是,在较新的架构上,如果您声明一个属性,则不需要专门声明 iVar,因为它是为您完成的。

实际上,这是首选 - 但是,请确保如果您同时声明两者,您会意识到当您直接访问 iVar 或通过 getter 和 setter 时。

于 2012-07-16T19:19:06.523 回答
1

这是个人喜好问题,但我建议不要明确声明 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语句中输入了错误的名称。

只需声明属性,然后使用另一个名称(通常使用前面的下划线)声明 ivar,并且它是明确的(即,如果您忘记将属性正确@synthesize引用为 ,您不太可能意外引用您的 ivar )并且您永远不必担心,例如:varself.var

@interface MyClass
@property (nonatomic, strong) NSString *var;
@end

进而

@implementation MyClass
@synthesize var = _var;
于 2012-07-16T19:48:03.987 回答