我正在使用ARC,我的应用程序编译并运行而不会崩溃。但是,当我运行Analyze构建时,我看到了这些警告。我来自PHP和JavaScript,所以很自然我不知道如何解决这个问题。任何人都可以帮助我吗?
答案 0 :(得分:4)
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为您执行此操作。
(注意:我没有对此进行测试,但我认为这些是静态分析仪抱怨的问题。)
答案 1 :(得分:2)
是的,您可以使用:
NSArray *linkedPeople = (__bridge_transfer NSArray *)ABPersonCopyArrayOfAllLinkedPeople(person);
但Apple现在建议使用:
NSArray *linkedPeople = CFBridgingRelease(ABPersonCopyArrayOfAllLinkedPeople(person));
它做同样的事情,但Apple建议你使用后者。
在演示文稿中查看WWDC 2012 session 405,37:33。
答案 2 :(得分:1)
原来如此!即使您正在使用自动引用计数(ARC),阅读Objective-C内存管理仍然是一个好主意:
http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/
但是,针对您的具体问题:
通常,当您在Apple框架中看到包含单词Copy
的C方法时,您将获得该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/