1

アプリ内のXMLファイルをすばやく簡単に解析する必要があります。私にとって最善の解決策は、XMLからNSDictionaryへのコンバーターに沿ったものであり、それを簡単に掘り下げることができるようです。

私はこの小さなクラスを使用することを選択しました:http://troybrant.net/blog/2010/09/simple-xml-to-nsdictionary-converter/

しかし、私は返さNSDictionary*れたものとメモリ内のその状態について混乱しています。classメソッドdictionaryForXMLDataは、クラスを割り当てて初期化します。その後、オフになり、呼び出し元に返されるオブジェクトをobjectWithData返す重い持ち上げを行います。NSDictionary

私にとって紛らわしい部分は[reader release]、帰国前です(これは、reader作成された方法のために発生する必要があることを理解しています)。私の理解でNSDictionaryは、すべてのオブジェクトにもreleaseメッセージが送信されます。つまり、返されるオブジェクトには保持カウントがないはずです。オブジェクトは便利なメソッドで作成され、スタックに追加されたときにのみ保持カウントを取得することに注意してください。

returnステートメントは。ではないはずreturn [rootDictionary autorelease]です。それで私が見る問題は、いつrootDictionaryリリースされるかわからないことであり、XMLファイルのサイズによってはメモリを詰まらせる可能性がありますか?それとも私はそれをすべて間違っていますか?

4

1 に答える 1

1

彼らがしていることは正しくありません。によって返されるオブジェクトは、objectWithData:おそらく内部に保持されているものへの単なる参照readerです。そして、をリリースすることで、以前に取得したreaderものの割り当てを解除できる可能性がありますrootDictionaryXMLReaderクラスの内部動作によっては、戻ってきたもの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 に答える