【问题标题】:Autorelease CFMutableDictionary自动释放 CFMutableDictionary
【发布时间】:2011-11-28 15:05:43
【问题描述】:

如何自动释放 CFMutableDictionary?

我是这样创建的:

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

在dealloc中:

self.mappingByMediatedObject = nil;

【问题讨论】:

    标签: objective-c ios memory-management autorelease cfmutabledictionary


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      [(NSDictionary *)aDictionaryRef autorelease];
      

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

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

      【讨论】:

      • 实际上这不起作用,因为我不能将保留用作属性属性,因为值 (CFMutableDictionary) 不是对象,因此这样做会导致立即收集实例。但这只是我的具体情况,不是我问的。
      【解决方案3】:

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

      所以要自动释放CFDictionary,您可以编写以下代码:

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 2011-05-03
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多