使用CFDictionaryRef和ABMutableMultiValueRef进行无法解释的泄漏

时间:2009-10-23 11:30:50

标签: objective-c cocoa cocoa-touch

以下代码创建了一些我不理解的泄漏,因为我发布了使用Create或Copy创建的所有对象。我没有广泛使用CF对象,所以我可能对保留周期有误解。任何帮助将不胜感激:

ABMutableMultiValueRef webServices = ABRecordCopyValue(aRecord, kABPersonInstantMessageProperty);

    for (CFIndex i = 0; i < ABMultiValueGetCount(webServices); i++) { 

        CFDictionaryRef webService = CFDictionaryCreateCopy(NULL, ABMultiValueCopyValueAtIndex(webServices, i));

        webServiceLabel = ABMultiValueCopyLabelAtIndex(webServices, i);

        webServiceProvider = CFDictionaryGetValue(webService, kABPersonInstantMessageServiceKey);
        webServiceUserName = CFDictionaryGetValue(webService, kABPersonInstantMessageUsernameKey);

        // Data to be saved at this point
        if (webService) CFRelease(webService);
        if (webServiceLabel) CFRelease(webServiceLabel);
    }

    if (webServices) CFRelease(webServices);

2 个答案:

答案 0 :(得分:3)

这是你的问题:

CFDictionaryRef webService = CFDictionaryCreateCopy(NULL, ABMultiValueCopyValueAtIndex(webServices, i));

ABMultiValueCopyValueAtIndex创建一个永远不会分配给变量的对象。它需要被释放,但永远不会被释放。那是内存泄漏。

答案 1 :(得分:0)

我像这样运行模拟器

MallocStackLogging=1 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator

然后运行该应用,然后运行leaks appname

我把你的代码放在一个测试应用程序中,并且实际上看不到很多东西,在基础或可可代码深处分配形式的一些“泄漏”。

您是否可以使用上述内容运行您的应用并显示可以追溯到运行上述代码的方法的泄漏?