2010-08-03 68 views
0

我不熟悉C.我有其他人创建了一种方法,有一个是这样的iphone - 释放一个CFDictionary

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

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

我想dealloc的字典现在创建了一个CFDicionary。据我所知,我必须逐字逐一阅读字典中有多少个条目,并且每个条目都是免费的。

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

所以,我怎么遍历通过这个CFDictionary释放储存在那里的每个点,并删除每个字典词条?

感谢您的任何帮助。

回答

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的新手,这不是开始的地方。

+0

我明白你是对的。我试图实现你所说的,我从编译器收到错误。例如,在我看到的免费(价值)行上(“警告:将'free'的参数1从指针目标类型中丢弃限定符”)。那么,您能否告诉我如何添加和删除此字典中的对象,以及如何在实施您的方法后发布字典?请为我的案件专门编码,因为我没有办法在C中推断伪代码并适用于我的案例......我完全不在C中。 – SpaceDog 2010-08-04 06:18:01

+1

要消除警告,只需将free(value)更改为free((void *)value)即可​​。 一旦你使用这个valueCallback,你可以使用CFRelease(touchBeginPoints)来释放字典,就像@rastersze建议的那样。 您不需要遍历字典的内容。从字典中删除一个对象现在将释放它。请注意,对于其他应用程序来说,这是否是件好事是不可能的。猜测,你在这里复制Erica Sadun,这对尝试一个noob不是一件好事。 – Jeff 2010-08-05 01:08:24

+0

我知道,但埃里卡的例子只是坐在那里做一个我想做的事,而且我永远不需要修改。她在C和C中做了很多事情,并且C融化了我的大脑。我总是试图将所有东西从C/C++转换为Objective-C,但首先我必须了解所做的事情。过去我成功地完成了这个任务,但是这本字典的东西让我很难过。谢谢! – SpaceDog 2010-08-05 09:39:57

0

您可以使用CFDictionary和NSDictionary中之间的Objective-C的免费桥接,如果你想:

[(id)touchBeginPoints release]