0

メモリ不足の警告 (WWDC 2009 ビデオのセッション 416 にある) を処理するための Apple の推奨事項に従って、dataController オブジェクト (アプリ デリゲートで参照) を解放することで使用されるリソースを解放しようとしています。 plistから読む:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
   [_dataController release];
   _dataController = nil;
   NSLog([NSString stringWithFormat:@"applicationDidReceiveMemoryWarning bottom...      retain count:%i", [_dataController retainCount]]);
}      

しかし、Instruments 内で ObjectAlloc を実行し、低メモリ状態をシミュレートすると、NSLog ステートメントが書き出され、オブジェクトの保持カウントがゼロであっても、アプリで使用されるメモリの減少は見られません。アプリ デリゲートへの参照を一部のビュー コントローラーに渡します。しかし、上記のコードは _dataController オブジェクト (plist データを含む) への参照を解放するため、メモリが解放されることが期待されます。

どんな助けでも大歓迎です。

4

2 に答える 2

1

app delegate が の唯一の所有者であると確信しています_dataControllerか? -releaseref カウントを減らすだけで、ref カウントがゼロにならない限りオブジェクトの割り当てを解除しません。

_dataControllerが他のオブジェクトにも所有されている場合は、それらにメッセージを送信して解放します。

于 2010-04-22T06:04:47.747 に答える
0

私はそれを再確認しています。入力していただきありがとうございます!Apple のメモリ管理ドキュメントを読み直し、DataController の dealloc メソッドに NSLog ステートメントを挿入しましたが、呼び出されています。また、リリース前の保持回数を書き出して、_dataController を nil に設定しました。保持カウントは 1 です。

したがって、これにより、メモリ使用量が大幅に減少していない理由に戻ります。Instruments の ObjectAlloc 表示と、アプリで最大のメモリ割り当てが行われている場所をよりよく理解する必要があると思います。この分野でヘルプを検索した後、Instruments からこれが発生した場所を特定しようとすることに不満を感じています。「すべての割り当て」に 3.54 MB、Malloc 32.00 KB に 608 MB あることがわかります。Malloc をドリルダウンすると、責任ある呼び出し元が png_malloc や inflateEnd などのフレームワーク呼び出しであることがわかります。Malloc を担当するコード内の呼び出しを探していますが、それが表示されません。これはすべて、メモリ不足の状態で使用されるメモリの量に大きな違いをもたらすオブジェクトまたはオブジェクトを解放しているのかどうか疑問に思っていることを意味します。楽器の詳細なチュートリアルが必要だと思います。Apple ヘルプ ドキュメントは問題ありませんが、コード付きの例がより役に立ちます。

于 2010-04-23T15:29:48.117 に答える