0

私はsqliteデータベースを使用しているiPhoneアプリケーションで作業しています。iPad、iPhone 4でメモリリークを確認しましたが、メモリリークはありません。しかし、同じコードはiPhone-3GSのメモリリークを示しています。下のスクリーショットを見てください。楽器が漏れを見せてくれた後よりも漏れはないと思います。アドバイスしてください。

前もって感謝します。

ここに画像の説明を入力してください

4

3 に答える 3

4

実際にはそれほど奇妙なことではありません。メモリをとの両方に割り当てる方法を参照しQueryQuery1ください[[NSArray alloc] init。しかし、その後、を呼び出してそれらのポインタを上書きする[database executeQuery:]ため、割り当てられたメモリがリークされます。

とにかく配列の割り当ては実際には必要ないように見えるので、その行を削除するだけです。ただし、アプリをクラッシュ[Query release][Query1 release]せないこと(または少なくとも後の時点で)は、[database executeQuery:]保持されたメモリを返すことを示し、その所有権を呼び出し元に委任します。これは、メモリガイドラインによって推奨されていません。から自動解放されたオブジェクトを返す必要 executeQuery: があります。戻り値を使用することはないため、メソッドを次のように単純に減らすことができます。

[self databaseOpen];
[database executeQuery:@"Delete from ActivityList"];
[database executeQuery:@"Select* from ActivityList"];
于 2012-06-19T11:49:49.163 に答える
3

問題はこれです:

NSArray *Query = [[NSArray alloc] init];
// later:
Query = [database executeQuery:str];

したがって、NSArrayを割り当ててからそのポインタを再利用すると、最初に割り当てられたオブジェクトへの参照が失われます。あなたはする必要はありません

NSArray *Query = [[NSArray alloc] init];

executeQuery:メソッドが初期化された配列を返すため。

同じことがQuery1にも当てはまります(誤って割り当てていることにもなります)。

(ちなみに、私のSQLHelperライブラリを使用していますか?使用している場合は、クエリによって返された配列を解放しないでください。自動解放され、過剰解放するとクラッシュします)

于 2012-06-19T11:50:41.243 に答える
1

それは、あなたがそれらを割り当てNSArrayているが決してそれらを使用していないので、あなたはすぐにあなたのである他のものにポインタを変更します。これらに変更すれば問題ありません。QueryQuery1[xxxx executeQuery:xxx]

NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];
于 2012-06-19T11:52:41.703 に答える