使用属性声明实例变量或不声明时有什么区别?

时间:2012-07-16 19:16:07

标签: objective-c ios

  

可能重复:
  Properties and Instance Variables in Objective-C 2.0

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

3 个答案:

答案 0 :(得分:2)

没有区别:您声明的实例变量将被使用,其ARC属性将被您声明的@property覆盖。

  

属性的指定所有权保留在其元数据中,但除非属性是合成的,否则其含义纯属常规。如果合成了一个属性,则关联的实例变量是实例变量,它可能由@synthesize声明隐式命名。 如果关联的实例变量已存在,则其所有权限定必须等于该属性的所有权;否则,将使用该所有权限定创建实例变量。

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

@synthesize myproperty = _myivar;

答案 1 :(得分:1)

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

这是偏好,真的 - 然而,确保如果你同时宣布两者,你会意识到你何时直接访问iVar,或者通过getter和setter。

答案 2 :(得分:1)

这是个人偏好的问题,但我建议不要明确宣布ivars。我在这里看到了人们做过类似事情的情况:

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

然后

@implementation MyClass
@synthesize var = _var;

因此,用户已显式声明属性和同名的ivar,但随后合成了生成另一个ivar的属性(在此示例中,名称中包含前一个下划线的ivar),导致生成两个ivar 。然后他们想知道为什么他们明确宣布的ivar不起作用。如果你没有明确声明你的ivar,你就不会有这个问题意外地结束了两个ivars,因为你碰巧在ivar显式声明或@synthesize语句中输错了名字。

只使用其他名称(通常使用前面的下划线)仅声明属性然后@synthesize ivar,并且它是明确的(即如果您忘记引用该属性,则不太可能偶然引用您的ivar var正确为self.var),您永远不必担心,例如:

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

然后

@implementation MyClass
@synthesize var = _var;