我是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;
}所以我试着用下面的代码释放paths变量,这仍然会泄漏内存。
- (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相关的内存量继续增长。
对我可能做错了什么有什么建议吗?谢谢!
发布于 2012-02-20 21:28:57
您的getDBPath代码很好,但它可能是从没有任何自动释放池的上下文中调用的。
通过在循环代码中分配您自己的池来修复它:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for (int iLoop = 0; iLoop < 30; iLoop++) {
NSString *dbPath = [self getDBPath];
// [dbPath release]; // do not release! dbPath will be autoreleased
sleep(1);
}
[pool drain];发布于 2012-02-18 15:01:31
你不应该释放一个你不拥有的对象。在您的情况下,您正在尝试释放您尚未拥有的内存。在“路径”中,总是指由"NSSearchPathForDirectoriesInDomains“分配和管理的内存。所以在这种情况下你不应该释放内存。制定一条通用规则,除非你自己分配内存,否则你不应该为你在程序中使用的每个指针调用释放内存。希望这能有所帮助!
https://stackoverflow.com/questions/5851848
复制相似问题