首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iphone NSSearchPathForDirectoriesInDomains内存泄漏?

iphone NSSearchPathForDirectoriesInDomains内存泄漏?
EN

Stack Overflow用户
提问于 2011-05-02 06:20:18
回答 2查看 1.6K关注 0票数 1

我是iPhone objectiveC开发的新手。当我运行下面的方法时,我得到了内存泄漏。

代码语言:javascript
复制
- (NSString *) getDBPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"dbname.sqlite"];
}

我发现如果我把它减少到以下几点...它还在漏水

代码语言:javascript
复制
 - (NSString *) getDBPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    return nil;
}

所以我试着用下面的代码释放paths变量,这仍然会泄漏内存。

代码语言:javascript
复制
 - (NSString *) getDBPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    [paths release];
    return nil;
}

为了检测泄漏,我使用以下循环在分析器中运行它:

代码语言:javascript
复制
for (int iLoop = 0; iLoop < 30; iLoop++) {
    NSString *dbPath = [self getDBPath];
    [dbPath release];
    sleep(1);
}

与NSPathStore2和NSArrayM相关的内存量继续增长。

对我可能做错了什么有什么建议吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-20 21:28:57

您的getDBPath代码很好,但它可能是从没有任何自动释放池的上下文中调用的。

通过在循环代码中分配您自己的池来修复它:

代码语言:javascript
复制
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];
票数 1
EN

Stack Overflow用户

发布于 2012-02-18 15:01:31

你不应该释放一个你不拥有的对象。在您的情况下,您正在尝试释放您尚未拥有的内存。在“路径”中,总是指由"NSSearchPathForDirectoriesInDomains“分配和管理的内存。所以在这种情况下你不应该释放内存。制定一条通用规则,除非你自己分配内存,否则你不应该为你在程序中使用的每个指针调用释放内存。希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5851848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档