iPhone NSSearchPathForDirectoriesInDomains内存泄漏?

| 我是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相关的内存量继续增长。 关于我可能做错的任何建议吗? 谢谢!     
已邀请:
您的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];
    
您不应该释放不属于您的对象。在您的情况下,您尝试取消分配尚未拥有的内存。如同在\“ paths \”中一样,始终指代由\“ NSSearchPathForDirectoriesInDomains \”分配和管理的内存。因此,在这种情况下,您不应该释放内存。制定一般规则,除非您自己分配内存,否则不应为程序中使用的每个指针调用释放内存。希望这可以帮助 !     

要回复问题请先登录注册