2011-03-25 126 views
2

我是iphone开发人员和处理内存问题的新手。 我在学习,但有些东西对我来说依然神秘。内存泄漏问题

在以下情况下,“Instruments”的泄漏分析器说我在databasePath设置中存在泄漏。我无法弄清楚为什么。

// databaseName and databasePath are properties of my class. 
databaseName = [[NSString alloc] initWithString:@"sqlDbName.sql"]; 

NSArray *documentPaths = [[NSArray alloc] initWithArray:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)]; 

NSString *documentsDir = [[NSString alloc] initWithString:[documentPaths objectAtIndex:0]]; 

// The problem is here : 
databasePath = [[NSString alloc] initWithString:[documentsDir stringByAppendingPathComponent:databaseName]]; 

[documentPaths release]; 
[documentsDir release]; 

我稍后在dealloc中释放databaseName和databasePath。

您的帮助将非常感谢!

+0

你的意思是你释放'databasePath'和'databaseName'在你的dealloc方法中(你的最后一段说'databasePath'两次)? – Rog 2011-03-25 09:59:04

+0

在dealloc中我释放databasePath和databaseName,没错。 – 2011-03-25 10:41:39

回答

5

是否有任何可能性,此代码正在执行多次。您已在dealloc中发布databasePath。如果这个代码被执行多次,那么databasePath会泄漏任何连续的执行。

+0

是的!你统治。该方法被调用两次。我修好了,没有更多的泄漏出现。非常感谢。 – 2011-03-25 10:45:42

+0

只是一个问题:如何在此论坛上标记“解决”我的答案? – 2011-03-25 10:48:54

+0

您选择的问题左侧的复选框为答案,只需点击它,它就会变成绿色:) – Rog 2011-03-25 10:52:08

1

如果你确实想有这个方法调用了两次,你可以这样做:

... 
[databasePath release]; 
databasePath = [[NSString alloc] initWithString:[documentsDir stringByAppendingPathComponent:databaseName]]; 
.... 

如果databasePath最初是零调用[databasePath release];不会做任何事情。

如果databasePath已经初始化,它将在确定新实例之前释放旧的实例。

+0

谢谢,这将会有所帮助。 – 2011-03-28 07:44:08