首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iphone --释放CFDictionary

iphone --释放CFDictionary
EN

Stack Overflow用户
提问于 2010-08-04 05:48:31
回答 3查看 1.5K关注 0票数 0

我不熟悉C语言。我有一个由其他人创建的方法,它的CFDicionary是这样创建的。

代码语言:javascript
复制
touchBeginPoints = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);

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

我现在想取消这本词典的配给。据我所知,我必须逐项查看字典中有多少个条目,并释放每个条目。

就像这样

代码语言:javascript
复制
        free((void *)CFDictionaryGetValue(touchBeginPoints, ...));
        CFDictionaryRemoveValue(touchBeginPoints, ...);

那么,我如何遍历这个CFDictionary,释放存储在其中的每个点并删除每个字典条目?

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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()”。你会意识到,所有那些告诉你发布字典的人,往好了说都会泄露信息,往坏了说就会崩溃。

然后创建一个结构,如下所示:

代码语言:javascript
复制
CFDictionaryValueCallBacks myValueCallbacks = {
  0,
  NULL,
  myRelease,
  NULL,
  NULL
};

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

代码语言:javascript
复制
void myRelease ( CFAllocatorRef allocator, const void *value )
{
    free(value);
}

现在,每当字典释放这些值时,它都会为您调用free()。

话虽如此,如果你是C语言的新手,这不是一个开始的地方。

票数 3
EN

Stack Overflow用户

发布于 2010-08-04 06:22:18

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

[(id)touchBeginPoints release]

票数 0
EN

Stack Overflow用户

发布于 2010-08-04 06:36:00

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

在您的案例中:

代码语言:javascript
复制
CFRelease(touchBeginPoints);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3401028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档