iphone - 释放CFDictionary

时间:2010-08-03 21:48:31

标签: iphone ipad

我不熟悉C.我有一个由其他人创建的方法,其中有一个像这样创建的CFDicionary

touchBeginPoints = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);

point = (CGPoint *)malloc(sizeof(CGPoint));
CFDictionarySetValue(touchBeginPoints, touch, point);

我想现在解除字典。据我所知,我必须逐项逐项查阅字典中的任何条目并释放每一条。

类似

        free((void *)CFDictionaryGetValue(touchBeginPoints, ...));
        CFDictionaryRemoveValue(touchBeginPoints, ...);

那么,如何通过这个CFDictionary迭代释放存储在那里的每个点并删除每个字典条目?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

你没有。

您阅读此页:http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html#//apple_ref/doc/c_ref/CFDictionaryValueCallBacks

你认识到默认情况下,标准字典会调用CFRetain()来保持你传递它的值,而CFRelease()则放弃它。你认为“......但CFRetain()不适合被称为CGPoint”。你意识到所有那些告诉你只是发布字典的人最多会泄漏并且最坏的情况会崩溃。

然后创建一个这样的结构:

CFDictionaryValueCallBacks myValueCallbacks = {
  0,
  NULL,
  myRelease,
  NULL,
  NULL
};

并在创建字典(最后一个参数)时将其作为valueCallbacks参数传递。 myRelease函数应该如下所示:

void myRelease ( CFAllocatorRef allocator, const void *value )
{
    free(value);
}

现在,只要字典释放了值,它就会为你调用free()。​​

说了这么多,如果你是C的新手,这不是开始的地方。

答案 1 :(得分:0)

如果您愿意,可以在CFDictionary和NSDictionary之间使用Objective-C的免费桥接:

[(id)touchBeginPoints release]

答案 2 :(得分:0)

无需迭代它,只需使用CFRelease函数释放它。有关更多详细信息和信息,请参阅iPhone开发人员中心的苹果Memory Management Programming Guide for Core Foundation

在你的情况下:

CFRelease(touchBeginPoints);