【发布时间】:2011-05-01 22:20:18
【问题描述】:
我是 iPhone ObjectiveC 开发的新手。运行以下方法时出现内存泄漏。
- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"dbname.sqlite"];
}
我发现,如果我将其修剪到以下内容......它仍然会泄漏
- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
return nil;
}
所以我尝试使用以下方法释放路径变量,但仍然会泄漏内存。
- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
[paths release];
return nil;
}
为了检测泄漏,我在分析器中使用以下循环运行它:
for (int iLoop = 0; iLoop < 30; iLoop++) {
NSString *dbPath = [self getDBPath];
[dbPath release];
sleep(1);
}
与 NSPathStore2 和 NSArrayM 相关的内存量继续增长。
对我可能做错的事情有什么建议吗? 谢谢!
【问题讨论】:
-
什么是泄漏?你的第一种方法是完全合理的,正是你应该做的。
-
在分析器中运行它,在循环内。我刚刚更新了上面的原始问题,提供了有关循环的更多详细信息。
-
NSZombieEnabled仍然有效?或者没有 NSAutoReleasePool 因为它在后台运行? -
我对实际的分析没有启示,但重新测试一下:如果你没有在任何地方保留它,你不应该释放字符串,并且自动释放池不会直到事件循环之后才被耗尽。也就是说,不确定您为什么会看到泄漏。
-
我认为还有其他原因,因为这些行不会泄露给我。
标签: iphone ios memory memory-leaks