ARC是否会自动释放Core Foundation对象,还是需要手动进行内存管理?

Leg*_*las 2 memory-leaks memory-management core-foundation xcode-instruments automatic-ref-counting

在我的代码中,我正在创建一个Core Foundation对象,从Apple文档中我知道

“ Core Foundation对象的寿命由其引用计数决定” https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Articles/lifecycle.html

因此,我非常怀疑核心基础对象是由ARC发布还是我们需要通过编写CFRelease(myobject)进行发布

我正在使用Xcode 6.4,目前在我的代码中没有使用任何CFRelease(myobject)释放我的Core Foundation对象,但是我仍然找不到在xcode工具中的任何内存泄漏(泄漏)

因此,我的问题是ARC是否将负责发布Core Foundation对象。

当我刚遇到一个类似的声明时,

回想一下,ARC仅处理Objective-C对象。它不管理非Objective-C对象的CoreFoundation对象的保留和释放。http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

因此,如果有人遇到相同的问题并找到一种解决方案,请与我们分享...

提前致谢..

Kaz*_*oto 5

您必须调用CFRelease以释放Core Foundation对象。

https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW1

编译器不会自动管理Core Foundation对象的生存期。您必须致电CFRetainCFRelease

或者,您可以使用__bridge_transferCFBridgingRelease将Core Foundation对象的所有权移至Objective-C ARC对象所有权下的。

  • __bridge_transferCFBridgingRelease将非Objective-C指针移至Objective-C,并将所有权转移到ARC。
    • ARC负责放弃对象的所有权。

因此,在以下情况下,NSString* __strong name变量具有Core Foundation对象的所有权。当变量name = nil;范围或name变量范围结束时,会自动释放Core Foundation对象。

NSString *name = (NSString *)CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
Run Code Online (Sandbox Code Playgroud)

要么

NSString *name = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
Run Code Online (Sandbox Code Playgroud)