我应该使用[autorelease]吗?

时间:2012-07-27 16:12:51

标签: objective-c memory-management retain autorelease

我需要快速简单地解析我的应用中的XML文件。对我来说最好的解决方案似乎是XML-to-NSDictionary转换器,我可以更容易地挖掘它。

我选择使用这个小班:http://troybrant.net/blog/2010/09/simple-xml-to-nsdictionary-converter/

但是我对返回的NSDictionary*及其在内存中的状态感到困惑。类方法dictionaryForXMLData分配并进入类。然后objectWithData关闭并重复提升返回到调用者的NSDictionary对象。

对我来说,令人困惑的部分是[reader release]返回之前(我知道这必须发生,因为reader的创建方式)。我对NSDictionary的理解是,所有对象也将被发送release消息,这意味着我们返回的对象不应该有保留计数。请注意,该对象是使用便捷方法创建的,只有在将其添加到堆栈时才会获得保留计数。

返回语句不应该是return [rootDictionary autorelease]。我看到的问题是,什么时候会释放rootDictionary,并且根据XML文件的大小,它可能会阻塞内存?或者我错了吗?

1 个答案:

答案 0 :(得分:1)

他们在做什么是不正确的。 objectWithData:返回的对象可能只是对reader内保留的内容的引用。通过发布reader,您可能会释放先前获得的rootDictionary。根据{{​​1}}类的内部工作原理,它们从XMLReader返回的内容可能会被保留并自动释放;但这是一个实现细节,你不能依赖它(加上Cocoa内存管理是本地的,所以你永远不应该关心其他函数做什么)。

正确的做法是保留你获得的objectWithData:,然后自动释放它(以平衡保留,因为你必须在没有所有权的情况下归还它)。

rootDictionary