2013-10-02 40 views
1

我知道NSObject实例是通过ARC处理的,CG引用不是(不确定CF对象)。如何知道使用ARC时需要释放哪些CG/CF对象?

我有一个内存泄漏,我发现使用仪器,CFString对象,不断增长和增长。我在我的应用程序中进行了搜索,并且没有使用CFString,所以我认为它嵌入了一些我需要发布的其他框架对象中。但是,我不知道哪些对象需要发布,哪些不需要发布。我已经分析了应用程序,它在内存泄漏方面很干净。

那么,是否有一些权威性的文档说明哪些对象需要发布?

+0

哈哈哈,你认为苹果会给你提供文档一样简单吗? – Kevin

+0

哈哈哈......那么如何在使用ARC时知道何时/是否要释放一个对象呢? – SpokaneDude

+0

更严重的是,一般情况下,如果它在函数名中有'Create'并且/或者它实际上是创建并返回一些东西(而不是在现有对象上运行),则需要释放它。否则,你通常不会。 – Kevin

回答

3

首先,是CFString还是NSCFStringNSCFString是桥接类,它通常可以在您的代码中出现在NSString的地方。

要调试您的特定问题,首先查看Instruments提供的堆栈跟踪。它会告诉你在哪里创建对象。这通常会帮助你知道它泄漏的是什么物体,然后你可以用它来追捕你的错误。

对于你的一般问题,几乎所有的对象都必须被释放。问题是ARC是否会为你插入发行版。我知道这听起来很迂腐,但这是一个重要的区别。 ARC不是垃圾收集。它只是在编译时以一种非常确定的方式插入内存调用(如果启用的话),用于ObjC对象类型和一些可以表现为ObjC对象类型(特别是dispatch_类型)的对象类型。有几种情况下,给定的对象可能需要在一个地方手动记忆,但在另一个地方接受自动记忆管理。请记住,CFStringRefNSString是免费桥接的。一个给定的对象可以被当作任何一个,所以可能在某些情况下被ARC管理,但是在其他情况下不被管理此外,ARC可能不会在所有编译单元(.m文件)上启用。

正如@Catfish_Man所解释的,你可以通过它们的@interface声明来识别ObjC对象。

+0

非常清楚...感谢您的详细信息...我很感激它... SD – SpokaneDude

+2

有一套@interface规则的例外,很遗憾。所有的dispatch_ *和xpc_ *类型都是ObjC,但是这并不明显从头文件中显而易见。 –

相关问题