2012-10-19 42 views
0

由下面的代碼得到的的NSString對象已得到的95使用GDataXML解析XML會返回一個retainCount爲95的NSString對象。如何確保它被釋放?

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"]; 

    } 

一個retainCount。所以它會在稍後發佈時

[myDict removeAllObjects]; 
[myDict release]; 

被調用。

我面臨的問題是,我有這樣的數百個字符串解析....所有他們的retaincounts約95 ...這些字符串會被釋放?

回答

3

我面臨的問題是,我有上百個這樣的 解析字符串....及其所有retaincounts都是圍繞95 ......將這些 字符串得到釋放?

首先,retainCount是無用的。別叫它。不,真的,don't use retainCount

要回答你的問題,請看儀器。你期望消失的物體是否真的停留在記憶中?如果是這樣,然後打開參考計數跟蹤,並查看仍然存在對它們的引用(或保留不平衡)。

更可能的是,XML子系統是唯一的 - 對字符串進行判斷,使得只有一次可能重複數百次的內容在內存中。因此,一個副本可能會保留幾十次或幾百次。當你從myDict​​,可能仍然有一個對象的引用。它甚至可能是一個autoreleased參考,因此,實際上會消失。

要知道的唯一方法是查看是否通過儀器(或其他方法)釋放對象。

1

根據定義&許多其他人的解釋,包括raywinderlich在他的How To Choose The Best XML Parser for Your iPhone Project

GDataXML不過是NSXML樣式的DOM XML解析器,由Google開發,作爲其Objective-C客戶端庫的一部分。它只包含一個M文件和一個頭文件,它支持讀取和寫入XML文檔和XPath查詢。

A DOM解析器讀取整個文檔並構建一個可以查詢不同元素的內存中表示。通常,您甚至可以構建XPath查詢來提取特定的部分。

因此,它只是爲給定的整個XML創建一個類似於樹的結構樹,可以查詢每個元素以抽取特定的部分。我們知道這一切都與指針一起工作,所以我們從這棵樹中得到的任何元素都只是指向那個對象,同名(用於初始化xml)或者一個新的名字,同時拉動特定的部分(使用NSXMLElement)。

所以一切都會保留下來,直到我們在初始化XML的同時發佈XMLDoc。

如果您希望我們可以在釋放XMLDoc後檢查保留計數(但它可能會導致崩潰,就像我們使用發佈的對象一樣)。

我認爲它的工作方式是這樣的,如果你或其他開發者有任何其他信息在此共享你的信息。

+0

但即使在gdataxml文檔發佈之後...它的剩餘價值仍然是95.有了這麼大的retaincount我懷疑即使我發佈字典..它會得到釋放嗎? – sujith1406

相關問題