私はsqliteデータベースを使用しているiPhoneアプリケーションで作業しています。iPad、iPhone 4でメモリリークを確認しましたが、メモリリークはありません。しかし、同じコードはiPhone-3GSのメモリリークを示しています。下のスクリーショットを見てください。楽器が漏れを見せてくれた後よりも漏れはないと思います。アドバイスしてください。
前もって感謝します。
私はsqliteデータベースを使用しているiPhoneアプリケーションで作業しています。iPad、iPhone 4でメモリリークを確認しましたが、メモリリークはありません。しかし、同じコードはiPhone-3GSのメモリリークを示しています。下のスクリーショットを見てください。楽器が漏れを見せてくれた後よりも漏れはないと思います。アドバイスしてください。
前もって感謝します。
実際にはそれほど奇妙なことではありません。メモリをとの両方に割り当てる方法を参照しQuery
てQuery1
ください[[NSArray alloc] init
。しかし、その後、を呼び出してそれらのポインタを上書きする[database executeQuery:]
ため、割り当てられたメモリがリークされます。
とにかく配列の割り当ては実際には必要ないように見えるので、その行を削除するだけです。ただし、アプリをクラッシュ[Query release]
さ[Query1 release]
せないこと(または少なくとも後の時点で)は、[database executeQuery:]
保持されたメモリを返すことを示し、その所有権を呼び出し元に委任します。これは、メモリガイドラインによって推奨されていません。から自動解放されたオブジェクトを返す必要 executeQuery:
があります。戻り値を使用することはないため、メソッドを次のように単純に減らすことができます。
[self databaseOpen];
[database executeQuery:@"Delete from ActivityList"];
[database executeQuery:@"Select* from ActivityList"];
問題はこれです:
NSArray *Query = [[NSArray alloc] init];
// later:
Query = [database executeQuery:str];
したがって、NSArrayを割り当ててからそのポインタを再利用すると、最初に割り当てられたオブジェクトへの参照が失われます。あなたはする必要はありません
NSArray *Query = [[NSArray alloc] init];
executeQuery:
メソッドが初期化された配列を返すため。
同じことがQuery1にも当てはまります(誤って割り当てていることにもなります)。
(ちなみに、私のSQLHelperライブラリを使用していますか?使用している場合は、クエリによって返された配列を解放しないでください。自動解放され、過剰解放するとクラッシュします)
それは、あなたがそれらを割り当てNSArray
ているが決してそれらを使用していないので、あなたはすぐにあなたのである他のものにポインタを変更します。これらに変更すれば問題ありません。Query
Query1
[xxxx executeQuery:xxx]
NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];