2

電話帳のiPhoneアプリケーションでコードをクリーンアップしていますが、InstrumentsのリークツールからNSCFStringオブジェクトがリークしていると報告されています。これが私がフォローしているパターンです:

アプリケーションにPersonクラスがあり、ローカルNSStringメンバーと、名前、名前などの関連プロパティしかありません。

私のビューコントローラーには、searchBarSearchButtonClickedイベントでSQLiteデータベースから入力されるNSMutableArrayプロパティがあります。このNSMutableArrayには、テーブルビューコントロールに入力するために使用されるPersonオブジェクトが入力されます。また、ユーザーがビュー内の人物をクリックすると、その人物オブジェクトが詳細ビューに渡され、名前だけでなく追加情報が表示されます。

最初のルックアップを実行して結果を表示するとき、メモリリークはありません。

ここで、2回目のルックアップを実行するときに、理想的にはNSMutableArrayをクリアして、メモリリークなしで新しい結果セットをリロードしたいと思います。したがって、これを行うには、personListプロパティでremoveAllObjectsを呼び出してから、データベースを呼び出して、以下に示すようにpersonListNSMutableArrayを再設定します。

[self.personList removeAllObjects];
self.personList = [SearchService GetPersonList:searchText];
[list reloadData];

removeAllObjectを呼び出すことにより、Personオブジェクトに関連付けられていた以前のリークを取り除きました。ただし、現在、個々のPersonオブジェクトのプロパティから残っているNSStringオブジェクトをリークしているようです。

これは可能ですか?

私はInstrumentsツールを初めて使用しますが、NCSFStringリークの1つにドリルダウンしたときに拡張詳細からわかることは、スタック内のコードの最後の行が、プロパティの@synthesizeコード行を指していることが多いということです。なので:

@synthesize firstName;

したがって、これらのNSStringがクリーンアップされていないと思うのはそのためです。メモリリークを発生させない、これを行うためのより良い方法はありますか?

4

1 に答える 1

3

PersonクラスNSStringのメソッドでsを解放しますか?dealloc

あなたがそのようにあなたの財産を設定したと仮定すると:

@property (retain) NSString *firstName;

firstNameセッターを使用して設定すると、保持されます。その後、Personインスタンスが解放されて割り当てが解除されたが、解放firstNameされていない場合、インスタンスはリークします。

それをクラスのdeallocメソッドに入れます。Person

- (void)dealloc
{
    [firstName release];
    [super dealloc];
}

(プロパティに使用される対応するivarfirstNameがと呼ばれると仮定しますfirstName)。

于 2009-08-26T15:27:25.537 に答える