1

我需要在我的应用程序中快速简单地解析一个 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 语句不是return [rootDictionary autorelease]. 我看到的问题是不知道什么时候rootDictionary会被释放,并且取决于 XML 文件的大小,它可能会阻塞内存?还是我全都错了?

4

1 回答 1

1

他们的做法是不正确的。返回的对象objectWithData:可能只是对内部保留的内容的引用reader。并且通过 release reader,你可能会释​​放rootDictionary你之前得到的。根据XMLReader类的内部工作,它们返回的东西可能会objectWithData:被保留和自动释放;但这是一个实现细节,你不能依赖它(加上 Cocoa 内存管理是本地的,所以你永远不应该关心其他函数的作用)。

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

+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error
{
    XMLReader *reader = [[XMLReader alloc] initWithError:error];
    NSDictionary *rootDictionary = [[[reader objectWithData:data] retain] autorelease];
    [reader release];
    return rootDictionary;
}
于 2012-07-27T19:21:31.597 回答