2011-02-05 118 views
2

我在的.h文件下面的代码:为什么NSString变量需要保留?

@interface Utils : NSObject { 
    NSString *dPath; 
}  
@property(nonatomic, retain) NSString *dPath; 

在我的.m文件

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName]; 
[dPath retain]; 

为什么我要保留dPath如果它已被定义为(非原子,保留)? 如果我不添加[dPath retain];我收到了一些奇怪的随机错误,并在其他函数中使用此变量时应用程序崩溃。我想这是因为一些autorelease somehere,但我没有任何。

那么,什么是(非原子,保留)做呢?是否真的有必要[dPath retain];或者我只是用这个隐藏别的东西?

+0

如果您在Utils中设置了dPath,请确保您使用的是self.dPath,而不仅仅是dPath – anq 2011-02-05 06:36:54

回答

7

由于代码不调用dPath属性的setter方法,它只是设置实例变量dPath直接:

dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName]; 
[dPath retain]; 

所以它需要手动保留。

您将能够(其实你需要)省略retain调用如果属性setter中使用这样的(注意self.):

self.dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName]; 

或类似这样(注意setDPath:):

[self setDPath:[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName]]; 

的制定者保留了NSString给你,让你不必自己做。


一个不错的小练习,以避免混乱跟随,是贴上下划线您伊娃的名字,以表明它是伊娃:

NSString *dPath_; 

然后合成你的财产就是这样,以它与你的不同名称伊娃关联:

// self.dPath is the property, dPath_ is the ivar 
@synthesize dPath = dPath_; 

然后修改dealloc方法,以及直接引用实例VAR任何其他代码,使用该贴名称,而不是:

- (void)dealloc { 
    [dPath_ release]; 

    [super dealloc]; 
} 
+0

我刚刚根据您的建议更改了代码,并且它正在工作。直到现在没有崩溃。我想我需要回到Objective-C的基本内容:(谢谢!! – KVron 2011-02-05 06:43:16

0

尝试设置与

self.dPath 
0

得到它。如果你想调用属性setter方法,这将调用保留,那么你想写:

self.dPath = ... 

干扰的东西到一个变量与:

dPath = ... 

完全忽略此实例变量的属性。这就是为什么你最终需要手动进行保留。

相关问题