我不熟悉C语言。我有一个由其他人创建的方法,它的CFDicionary是这样创建的。
touchBeginPoints = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
point = (CGPoint *)malloc(sizeof(CGPoint));
CFDictionarySetValue(touchBeginPoints, touch, point);我现在想取消这本词典的配给。据我所知,我必须逐项查看字典中有多少个条目,并释放每个条目。
就像这样
free((void *)CFDictionaryGetValue(touchBeginPoints, ...));
CFDictionaryRemoveValue(touchBeginPoints, ...);那么,我如何遍历这个CFDictionary,释放存储在其中的每个点并删除每个字典条目?
谢谢你的帮助。
发布于 2010-08-04 06:50:25
你没有。
你可以阅读这个页面:http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html#//apple_ref/doc/c_ref/CFDictionaryValueCallBacks
您会认识到,默认情况下,标准字典将调用CFRetain()来保留传递给它的值,而调用CFRelease()来释放它。您认为“不适合对CGPoint调用...but CFRetain()”。你会意识到,所有那些告诉你发布字典的人,往好了说都会泄露信息,往坏了说就会崩溃。
然后创建一个结构,如下所示:
CFDictionaryValueCallBacks myValueCallbacks = {
0,
NULL,
myRelease,
NULL,
NULL
};并在创建字典时将其作为valueCallbacks参数传递(最后一个参数)。myRelease函数应如下所示:
void myRelease ( CFAllocatorRef allocator, const void *value )
{
free(value);
}现在,每当字典释放这些值时,它都会为您调用free()。
话虽如此,如果你是C语言的新手,这不是一个开始的地方。
发布于 2010-08-04 06:22:18
如果您愿意,您可以使用Objective-C在CFDictionary和NSDictionary之间的免费桥接:
[(id)touchBeginPoints release]
发布于 2010-08-04 06:36:00
不需要遍历它,只需使用CFRelease函数释放它。有关更多细节和信息,请参阅iPhone开发人员中心上的苹果Memory Management Programming Guide for Core Foundation。
在您的案例中:
CFRelease(touchBeginPoints);https://stackoverflow.com/questions/3401028
复制相似问题