【问题标题】:Leak on NSFileMananer's contentsOfDirectoryAtPathNSFileMananer 的 contentsOfDirectoryAtPath 泄漏
【发布时间】:2011-07-25 04:15:49
【问题描述】:

在“checkFiles”方法中,我只是搜索了一个 NSDocumentDirectory 路径并请求了文件列表。

- (void) checkFiles{
        NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path = [pathList objectAtIndex:0];

        NSArray *dirArray = [myFileManager contentsOfDirectoryAtPath:path error:NULL]; // leak occurs here!

        /* .... */
}

-

-

Leaks Instruments 检测 NSFileManager 的 contentsOfDirectoryAtPath 方法的泄漏。

这是我在 Instruments 中单击一个名为 NSCFString 的泄漏对象时的堆栈跟踪。

   0 CoreFoundation __CFAllocatorSystemAllocate
   1 CoreFoundation CFAllocatorAllocate
   2 CoreFoundation _CFRuntimeCreateInstance
   3 CoreFoundation __CFStringCreateImmutableFunnel3
   4 CoreFoundation CFStringCreateWithBytes
   5 Foundation -[NSFileManager directoryContentsAtPath:matchingExtension:options:keepExtension:error:]
   6 Foundation -[NSFileManager contentsOfDirectoryAtPath:error:]

因为我经常调用“checkFiles”方法来更新包含文件列表的 UITableView,所以我无法避免这种泄漏。

我应该如何修复这种系统泄漏?

谢谢。

【问题讨论】:

    标签: iphone objective-c memory memory-leaks


    【解决方案1】:

    您确定 dirArray 没有保留在某处吗?也许是伪装的,比如作为参数传递给另一个方法?

    如果您想进行半自动检查,请使用 Instruments 的 Leaks 工具检查您发送的所有保留/释放消息(直接或间接)并检查每一条。

    【讨论】:

    • 感谢您的回答!实际泄漏发生在不同的地方,但它们共享相同的字符串内存地址。我做了 [myArray addObject: [[dirArray objectAtIndex: 1] copy]]
    • 很高兴听到您发现它很有用。
    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多