2013-02-01 73 views
3

我已经宣布的.h变量的属性时:iOS应用崩溃调用带有下划线格式

@property (nonatomic, retain) NSString *var; 

当我打电话使用属性变量:

_var = sumthing; 

应用程序崩溃,并且当我把它称为:

self.var = sumthing; 

它运作良好。

这两种情况有什么不同吗?

注:我没有使用@synthesize,因为它不需要特别写。

+0

为什么“_var”和“var”必须是相同的? – CReaTuS

+0

你使用ARC吗?你会得到什么崩溃? –

+0

如果您不使用ARC,则将directy分配给实例变量将不会保留该对象。分配给该属性将保留该对象。 – mttrb

回答

2

当您使用@property时,您应该使用self.var来保留sumthing,以便它在内部调用setter方法来保留它。如果直接分配它,setter方法将不会被调用,并且在sumthing发布时它将崩溃。

基本上,self.var = sumthing;等同于将sumthing分配给var,然后保留它(var = [sumthing retain];)。当你直接做这件事时,它只是分配部分而不是保留。因此,当sumthing获得发布时,当您使用var和您的应用程序崩溃时,您将指向一个已发布的变量。

如果你仍然想使用它而不使用self.var,你可以尝试使用_var = [sumthing retain];这可以工作。

这与合成无关,因为您不需要再使用它了。你可以跳过它。

0

你的@synthesized属性你的var与_var ..? 如果不是,它会直接将它视为var。不要使用_var。

+0

所以要么'@synthesize var = _var;'或者我应该总是使用'self.var'而不是'_var'? –

+0

嗯。如果它来自IBOutlet,如果我们不会@synthasized它也会自动采用,但是在编码方面我们需要做。 – Madhu

+0

好吧,我认为'@ synthesize'不是必需的,如果我直接使用'self.var' –