0

如何自动释放 CFMutableDictionary?

我正在这样创建它:

self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

在dealloc中:

self.mappingByMediatedObject = nil;
4

3 回答 3

3

CoreFoundation 没有自动释放的概念——这是一个 Cocoa 级别的构造。但是,对于像字符串和集合类这样的跨世界桥接的“免费”对象,您可以通过将 CF 引用转换为其相应的 Cocoa 引用并发送-autorelease消息来获得相同的结果,如下所示:

[(NSDictionary *)aDictionaryRef autorelease];

但是,在您的情况下,您可能真的不想在这里使用 autorelease,因为您没有交回 Cocoa 调用者的引用。为什么不对分配更明确一点,而是在设置后释放它,如下所示:

CFDictionaryRef mapping = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
self.mappingByMediatedObject = mapping;
CFRelease(mapping);
于 2011-09-30T16:42:39.333 回答
1

CFDictionary并且NSDictionary是免费桥接的。这意味着 CoreFoundation 对象和它的 Cocoa 对象是可以互换的。

因此,要自动释放 a CFDictionary,您可以编写以下内容:

CFDictionary dict = CFDictionaryCreateMutable(...);
self.mappingByMediatedObject = dict;
[(NSDictionary*)dict autorelease];

当然,仅当您的mappingByMediatedObject属性保留其值(@property(retain))时才自动释放字典

于 2011-09-30T16:41:25.627 回答
0

从 iOS7 和 Mac OS X 10.9 开始,您可以使用 Core-Foundation 自动发布函数 CFAutorelease()。

于 2014-05-21T14:54:59.353 回答