0

以下代码获取的 NSString 对象的 retainCount 为 95。

for(GDataXMLElement *ele in [doc.rootElement elementsForName:@"myKey"])
    {
        NSLog(@"myKey %d",[[[ele.children objectAtIndex:0] stringValue] retainCount]);

        [myDict setObject:[[ele.children objectAtIndex:0] stringValue] forKey:@"myKey"];

    }

. 那么它会在以后发布吗

[myDict removeAllObjects];
[myDict release];

叫做。

我面临的问题是我解析了数百个这样的字符串......并且他们所有的保留计数都在 95 左右......这些字符串会被释放吗?

4

2 回答 2

3

我面临的问题是我解析了数百个这样的字符串......并且他们所有的保留计数都在 95 左右......这些字符串会被释放吗?

一是retainCount没用。不要叫它。不,真的,不要使用 retainCount

要回答您的问题,请查看 Instruments。您期望消失的对象是否真的保留在内存中?如果是这样,那么打开引用计数跟踪并查看哪些仍然持有对它们的引用(或者哪些保留是不平衡的)。

很可能,XML 子系统对字符串进行唯一化,这样可能重复数百次的内容只有一份副本在内存中。结果,一份副本可能会保留数十次或数百次。当您removeAllObjects来自myDict时,可能仍然存在对对象的引用。它甚至可能是一个autoreleased 引用,因此实际上会消失。

唯一知道的方法是查看对象是否通过 Instruments(或其他方式)释放。

于 2012-10-19T16:42:33.480 回答
1

根据许多其他人给出的定义和解释,包括 raywinderlich 在他的How To Choose The Best XML Parser for Your iPhone Project中。

GDataXML 只不过是一个用于 iPhone 的 NSXML 样式的 DOM XML 解析器,由 Google 开发,作为其 Objective-C 客户端库的一部分。它仅由一个 M 文件和一个标头组成,支持读写 XML 文档和 XPath 查询。

DOM 解析器读取整个文档并建立一个内存表示,您可以查询不同的元素。通常,您甚至可以构造 XPath 查询来提取特定的部分。

所以它只是为给定的整个 XML 创建一个树状结构,可以查询每个元素以提取特定的部分。

正如我们所知,这一切都与指针一起工作,所以我们从这棵树中获得的任何元素都将只是指向该对象,具有相同的名称(在初始化 xml 时使用)或在拉取特定部分时使用新名称(使用NSXMLElement)。

因此,所有内容都将保留,直到我们在初始化 XML 时发布 XMLDoc。

如果您愿意,我们可以在释放 XMLDoc 后检查保留计数(但它可能会导致崩溃,因为我们使用释放的对象)。

我认为它以这种方式工作,如果您或其他开发人员对此有任何其他信息,请分享您的信息。

于 2012-10-19T11:55:23.773 回答