2012-07-16 118 views

回答

2

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

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

声明的属性,您打算@synthesize实例变量,最好避免。如果你喜欢用不同名称的实例变量,你可以使用合成的语法与伊娃的名字:

@synthesize myproperty = _myivar; 
+2

+1 - 我敢肯定,你用'_myivar'从'myproperty'区别,但对于新用户来说,我会指出你显然希望使用'@synthesize var = _var;'(其中,伊娃与属性名称相同,只有前缀为下划线)。顺便说一下,根据WWDC 2012的视频,“@ synthesize”语句将来是可选的,在这种情况下,编译器会使用前面的下划线为您声明ivar。 – Rob 2012-07-16 19:30:50

+0

@RobertRyan感谢您提供即将发布的资讯!我一直在想,为什么编译器足够聪明,指出缺少'@ synthesize'指令给我,但不够聪明,无法插入它们。 – dasblinkenlight 2012-07-16 19:37:05

1

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

这是首选,确实如此 - 但是,确保如果你声明了两者,你会意识到何时直接访问iVar,或者通过getters和setter。

1

这是个人喜好的问题,但我建议不要显式声明ivars。我在这里看到像这样,人们做的事情的情况:

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

然后

@implementation MyClass 
@synthesize var = _var; 

因此,用户已经明确地宣布两个属性和名称相同的伊娃,但然后综合生成另一个ivar的属性(在本例中,名称中带有前面下划线的那个),从而生成两个ivars。然后他们想知道为什么他们明确宣布的伊娃不起作用。如果您没有明确声明您的伊娃,那么您不会有意外结束两个伊娃的问题,因为您碰巧在伊娃明确声明或@synthesize声明中输入了该名称。

只是声明只有属性,然后@synthesize使用其他名称(通常与前面的下划线)伊娃,这是明确的(即您是不太可能,如果你忘记正确引用属性var为引用您的伊娃意外self.var),你永远不用担心,例如:

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

然后

@implementation MyClass 
@synthesize var = _var;