可能重复:
Properties and Instance Variables in Objective-C 2.0用属性声明实例变量或不声明时有什么区别?
是什么,当我使用@property和@synthesize在第一种情况下的差异,@property和@synthesize,也宣告相同的实例变量?因为两者似乎都有效。
可能重复:
Properties and Instance Variables in Objective-C 2.0用属性声明实例变量或不声明时有什么区别?
是什么,当我使用@property和@synthesize在第一种情况下的差异,@property和@synthesize,也宣告相同的实例变量?因为两者似乎都有效。
没有区别:您声明的实例变量将被使用,其ARC属性将被您声明的这些@property
覆盖。
属性的指定所有权保留在其元数据中,否则其含义是纯传统的,除非该属性是合成的。如果一个属性被合成,那么相关的实例变量就是由@synthesize声明命名的实例变量,可能是隐含的。 如果关联的实例变量已经存在,则其所有权限定必须等于该属性的所有权;否则,该实例变量是使用该所有权限制创建的。
声明的属性,您打算@synthesize
实例变量,最好避免。如果你喜欢用不同名称的实例变量,你可以使用合成的语法与伊娃的名字:
@synthesize myproperty = _myivar;
两个做的工作 - 但是,在新的架构中,如果你声明一个属性,你不需要专门声明一个iVar,因为它是为你完成的。
这是首选,确实如此 - 但是,确保如果你声明了两者,你会意识到何时直接访问iVar,或者通过getters和setter。
这是个人喜好的问题,但我建议不要显式声明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;
+1 - 我敢肯定,你用'_myivar'从'myproperty'区别,但对于新用户来说,我会指出你显然希望使用'@synthesize var = _var;'(其中,伊娃与属性名称相同,只有前缀为下划线)。顺便说一下,根据WWDC 2012的视频,“@ synthesize”语句将来是可选的,在这种情况下,编译器会使用前面的下划线为您声明ivar。 – Rob 2012-07-16 19:30:50
@RobertRyan感谢您提供即将发布的资讯!我一直在想,为什么编译器足够聪明,指出缺少'@ synthesize'指令给我,但不够聪明,无法插入它们。 – dasblinkenlight 2012-07-16 19:37:05