Objective c 自动释放CFMutableDictionary

Objective c 自动释放CFMutableDictionary,objective-c,ios,memory-management,autorelease,cfmutabledictionary,Objective C,Ios,Memory Management,Autorelease,Cfmutabledictionary,如何自动释放CFMutableDictionary 我是这样创作的: self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); [(NSDictionary *)aDictionaryRef autorelease]; CFDictionaryRef mapping =

如何自动释放CFMutableDictionary

我是这样创作的:

self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
[(NSDictionary *)aDictionaryRef autorelease];
CFDictionaryRef mapping = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
self.mappingByMediatedObject = mapping;
CFRelease(mapping);
在dealloc中:

self.mappingByMediatedObject = nil;

CFDictionary
NSDictionary
是免费桥接的。这意味着CoreFoundation对象及其Cocoa对应对象是可交换的

因此,要自动释放一个
CFDictionary
,您可以编写以下代码:

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

当然,只有当您的
mappingByMediatedObject
属性保留其值(
@property(retain)

CFDictionary
NSDictionary
是免费桥接的时,才会自动释放词典。这意味着CoreFoundation对象及其Cocoa对应对象是可交换的

因此,要自动释放一个
CFDictionary
,您可以编写以下代码:

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

当然,只有当您的
mappingByMediatedObject
属性保留其值(
@property(retain)

CoreFoundation没有自动删除的概念时,才会自动删除字典——这是一个Cocoa级别的构造。但是,对于跨越字符串和集合类等世界的对象,可以通过将CF引用强制转换为其相应的Cocoa引用并向其发送
-autorelease
消息来获得相同的结果,如下所示:

self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
[(NSDictionary *)aDictionaryRef autorelease];
CFDictionaryRef mapping = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
self.mappingByMediatedObject = mapping;
CFRelease(mapping);
但是,在您的情况下,您可能并不真正希望在这里使用autorelease,因为您没有将引用交还给Cocoa调用方。为什么不在分配方面更明确一点,在设置之后再释放它,就像这样:

self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
[(NSDictionary *)aDictionaryRef autorelease];
CFDictionaryRef mapping = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
self.mappingByMediatedObject = mapping;
CFRelease(mapping);

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

self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
[(NSDictionary *)aDictionaryRef autorelease];
CFDictionaryRef mapping = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
self.mappingByMediatedObject = mapping;
CFRelease(mapping);
但是,在您的情况下,您可能并不真正希望在这里使用autorelease,因为您没有将引用交还给Cocoa调用方。为什么不在分配方面更明确一点,在设置之后再释放它,就像这样:

self.mappingByMediatedObject = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
[(NSDictionary *)aDictionaryRef autorelease];
CFDictionaryRef mapping = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
self.mappingByMediatedObject = mapping;
CFRelease(mapping);

从iOS7和Mac OS X 10.9开始,您可以使用Core Foundation自动释放功能CFAutorelease()

从iOS7和Mac OS X 10.9开始,您可以使用Core Foundation自动释放功能CFAutorelease()

实际上,这不起作用,因为我不能使用retain作为属性属性,因为值(CFMutableDictionary)不是对象,所以这样做会导致立即收集实例。但这只是我的具体情况,而不是我所要求的。实际上这不起作用,因为我不能使用retain作为属性属性,因为值(CFMutableDictionary)不是对象,所以这样做会导致立即收集实例。但这只是我的具体情况,而不是我所要求的。