2012-07-27 124 views
1

我需要快速簡單地解析我的應用程序中的XML文件。對我來說最好的解決方案似乎是沿着XML到NSDictionary轉換器的方向,然後我可以更輕鬆地挖掘它們。我應該使用[autorelease]嗎?

我選擇使用這個小類: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文件的大小它可能會在那裏阻塞內存時不知道嗎?還是我有這一切錯了?

回答

1

他們在做什麼是不正確的。由objectWithData:返回的對象可能只是對reader內保留的內容的引用。通過釋放reader,您可能會釋放您之前獲得的rootDictionary。根據XMLReader類的內部工作原理,它可能保留並自動釋放它們從objectWithData:返回的內容;但是這是一個實現細節,你不能依賴它(加上Cocoa內存管理是本地的,所以你不應該關心其他函數做什麼)。

正確的做法是保留rootDictionary你得到,然後autorelease它(以平衡保留,因爲你必須返回它沒有所有權)。

+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error 
{ 
    XMLReader *reader = [[XMLReader alloc] initWithError:error]; 
    NSDictionary *rootDictionary = [[[reader objectWithData:data] retain] autorelease]; 
    [reader release]; 
    return rootDictionary; 
} 
+0

好的,所以我的理解是正確的。是的,我的'return [rootDictionary autorelease]'錯誤應該在'retain'之後,在'release'之前。 – Calvin 2012-07-29 07:18:45

+0

我已經解決了我關心的可能較大的'NSDictionary'留在內存中,直到autorelease池釋放它通過使用'@ autorelease'塊範圍的XML到'NSDictionary'轉換。這應該防止任何東西四處亂停並堵塞內存超過必要的時間。 – Calvin 2012-07-31 08:47:20

+0

@Calvin:當然,你可以添加一個autorelease塊。但是,你應該確保任何你想「帶出」autorelease塊(在這種情況下是'rootDictionary')。因此,您應該在該行保留'retain',但將autorelease移動到您返回的最後一行,而不是自動釋放塊 – newacct 2012-07-31 19:09:02