1

我正在使用 ARC,我的应用程序可以编译和工作而不会崩溃。但是,当我运行分析构建时,我看到了这些警告。我来自 PHP 和 JavaScript,所以我自然不知道如何修复这些东西。谁能帮我吗?

在此处输入图像描述

4

3 回答 3

4

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 可以为您执行此操作。

(注意:我没有对此进行测试,但我相信这些是静态分析器抱怨的问题。)

于 2012-12-01T02:45:35.130 回答
2

是的,您可以使用:

NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person);

但苹果现在建议使用:

NSArray *linkedPeople = CFBridgingRelease(ABPersonCopyArrayOfAllLinkedPeople(person));

它做同样的事情,但 Apple 建议您使用后者。

请参阅WWDC 2012 session 405 , 37:33 进入演示文稿。

于 2012-12-01T04:47:39.830 回答
1

所以!即使您使用的是自动引用计数 (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/

http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2012-12-01T02:46:19.423 回答