我正在使用 ARC,我的应用程序可以编译和工作而不会崩溃。但是,当我运行分析构建时,我看到了这些警告。我来自 PHP 和 JavaScript,所以我自然不知道如何修复这些东西。谁能帮我吗?
3 回答
ARC 在与 Core Foundation 打交道时需要一些帮助。试试这个:
NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person);
和
NSDictionary *personDictionary = (__bridge_transfer NSDictionary *)(ABMultiValueCopyValueAtIndex(addressFromPerson, 0));
__bridge_transfer
告诉 ARC 一个非 Objective-C(即 Core Foundation)指针正在移动到一个 Objective-C 指针,并且它允许 ARC 获取对象的所有权以进行内存管理。包含“复制”一词的 CF 函数会产生一个引用计数为 +1 的对象引用。如果您稍后没有显式调用CFRelease()
该对象,那么它将泄漏。__bridge_transfer
但是,使用ARC 可以为您执行此操作。
(注意:我没有对此进行测试,但我相信这些是静态分析器抱怨的问题。)
是的,您可以使用:
NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person);
但苹果现在建议使用:
NSArray *linkedPeople = CFBridgingRelease(ABPersonCopyArrayOfAllLinkedPeople(person));
它做同样的事情,但 Apple 建议您使用后者。
请参阅WWDC 2012 session 405 , 37:33 进入演示文稿。
所以!即使您使用的是自动引用计数 (ARC),阅读 Objective-C 内存管理仍然是一个好主意:
http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/
但是,对于您的具体问题:
通常,当您在 Apple 框架中看到包含该词的 C 方法时Copy
,您将拥有该 Core Foundation 类型的所有权,您需要将其释放。当您想释放该类型时,只需使用:
CFRelease(addressFromPerson)
这是第一个问题。您的屏幕截图切断了第二个错误,所以我只是推测,但我认为您还需要发布您的NSDictionary *personDictionary
. 相似地:
CFRelease(personDictionary)
请注意,您还需要管理内存linkedPeople
通常 ARC 会为您处理内存管理,但是在使用 Core Foundation 类型时,您仍然需要自己清理。
我强烈建议您查看这些有关使用 ARC 进行内存管理的重要资源,尤其是在处理 CF 类型和免费桥接时:
http://www.joergjacobsen.com/blog/2011/10/05/managing-toll-free-bridging-in-an-arced-environment/