我的代码如下所示:
CFDictionaryRef myFunction()
{
CFIndex myNumberIndex = 1234;
CFNumberRef myNumber = NULL;
CFMutableDictionaryRef theDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 0, 0);
myNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &myNumberIndex);
CFDictionaryAddValue(theDict, kSomeKeyConstant, myNumber);
return theDict;
}
clang静态分析器报告myNumber
是泄漏的对象。很明显,因为我没有打电话给CFRelease()
,我倾向于理解这个问题,但我对CF一般都不够精通,所以我想验证:{{1}需要在这里发布,即使它已被添加到返回的CFDictionary中?那就是......我正在为字典添加一个有自己的保留/释放需求的副本(在这种情况下我需要在这里发布它)?我假设答案与创建字典时使用的myNumber
参数有关,但我没有看到对象所有权的明确指示。
答案 0 :(得分:3)
myNumber是否需要在此处发布,即使它被添加到返回的CFDictionary中?
是的,你需要发布它。如果字典想要保留该对象,它将 - 字典对它的作用不是你的问题。但是你创建了这个对象,所以你需要释放它。
从调用myFunction()
的函数的角度来看这个问题可能会有所帮助。 myFunction()
返回CFDictionary。当调用者不再需要字典时,是否应该释放该字典中的每个对象?当然不是。但是如果来电者没有这样做,如果你不发布myNumber
,那么该对象将永远不会被释放,对吧?那是一次泄密。
有关详细说明,请参阅Core Foundation memory management rules。其中一个示例几乎是相同的情况,并显示正在按要求执行释放:
float myFloat = 10.523987;
CFNumberRef myNumber = CFNumberCreate(kCFAllocatorDefault,
kCFNumberFloatType, &myFloat);
CFMutableArrayRef myArray = CFArrayCreateMutable(kCFAllocatorDefault, 2, &kCFTypeArrayCallBacks);
CFArrayAppendValue(myArray, myNumber);
CFRelease(myNumber);