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 サブシステムは、何百回も繰り返される可能性のあるもののコピーが 1 つだけメモリに存在するように、文字列を一意化しています。結果として、その 1 つのコピーが何十回または何百回も保持される可能性があります。removeAllObjectsから移動した場合myDict、オブジェクトへの参照が残っている可能性があります。autoreleased 参照である可能性もあるため、実際にはなくなります。

知る唯一の方法は、オブジェクトが Instruments (またはその他の手段) を介して割り当て解除されているかどうかを確認することです。

于 2012-10-19T16:42:33.480 に答える
1

How To Choose The Best XML Parser for Your iPhone Projectで raywinderlich を含む他の多くの人によって与えられた定義と説明に従って。

GDataXMLは、Google が Objective-C クライアント ライブラリの一部として開発した、iPhone 用の NSXML スタイルの DOM XML パーサーに他なりません。M ファイルとヘッダーだけで構成され、XML ドキュメントと XPath クエリの読み取りと書き込みの両方をサポートします。

DOM パーサーはドキュメント全体を読み取り、さまざまな要素を照会できるメモリ内表現を構築します。多くの場合、XPath クエリを作成して特定の部分を引き出すことさえできます。

したがって、指定された XML 全体の構造のようなツリーを作成するだけで、各要素を照会して特定の部分を取得できます。

そして、私たちが知っているように、これはすべてポインターで機能するため、このツリーから取得する要素はすべて、同じ名前 (xml の初期化中に使用) または特定の部分をプルするとき (を使用NSXMLElement) の新しい名前で、そのオブジェクトを指すだけです。

したがって、XML の初期化中に XMLDoc を解放するまで、すべてが保持されます。

必要に応じて、XMLDoc を解放した後に保持カウントを確認できます (ただし、解放されたオブジェクトを使用しているため、クラッシュする可能性があります)。

あなたまたは他の開発者がこれに関する他の情報を共有している場合は、このように機能すると思います。

于 2012-10-19T11:55:23.773 に答える