【问题标题】:CFAutoRelease() -like behavior on iOS6iOS6 上的 CFAutoRelease() 类似行为
【发布时间】:2013-10-07 16:04:38
【问题描述】:

我有一个创建 ABRecordRef、设置其属性并返回 ref 的方法。

我在使用 CFAutoRelease 时遇到了崩溃,因为我需要支持 iOS

-(ABRecordRef) myRecord{
 ABRecordRef newRecord = ABPersonCreate();
//some setting here
return CFAutoRelease(newRecord); //how to release here?
}

【问题讨论】:

标签: iphone ios objective-c core-foundation


【解决方案1】:

对于 CoreFoundation 引用,我实际上不会在您的 myRecord 方法中发布该引用。相反,我会定义接口,使myRecord 的调用者拥有引用并负责释放它。

【讨论】:

  • 确保正确命名方法。在这种情况下,它应该类似于newRecord。以new 开头,您清楚地表明该对象具有必须平衡的保留。
  • 没错,在使用 CoreFoundation 时,您应该尝试遵循“创建规则”。我实际上将方法命名为“CreateRecord”或“myRecordCreate”。这是 CoreFoundation 所有权政策的链接,其中包含更多信息,包括“创建规则”。 developer.apple.com/library/mac/documentation/corefoundation/…
  • 您也可以投到id 并调用-autorelease。 (这里还有一个问题作为公认的答案。)
【解决方案2】:

您应该能够为 Core Foundation 对象构建自己的自动释放函数,如下所示:

inline CFTypeRef MyAutorelease(CFTypeRef obj) { 
    id __autoreleasing result = CFBridgingRelease(obj); 
    return (__bridge CFTypeRef)result; 
}

使用__autoreleasing,您可以强制对象最终进入自动释放池。

【讨论】:

  • 其实迈克展示的方式并没有使用__autoreleasing。上面的代码来源于我对他的博文的评论。
  • 啊。我猜你是在我读了他的之后写的。你的和他的风格不同。您的后续问题是一个很好的问题
  • @TammoFreese 此代码在使用 Optimization Level -Os 时崩溃。知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多