2010-11-20 3 views
0

次の形式のメソッドを呼び出すのがLEAKSの理由であるかどうか知りたいですか?iphoneのsqliteクエリでリークが発生する

[userLookupWS initWithUsername:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 2)] andPassword:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 3)] andURL:[NSString stringWithFormat:@"%@%@", [NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 0)], [NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 1)]] andSSL:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 4)]]; 

私はこのステートメントで100%メモリリークを取得しているので、このメソッドにパラメータを渡す方法は他にありますか?

よろしく、 Accilies

+0

正確にはどのようなリークですか? userLookupWSインスタンスはおそらく?それからあなたはそれをリリースしていないし、それはSQLite関連のものの欠陥ではありません。どこに割り当てますか? – Pascal

+0

[FMDB](http://github.com/ccgus/fmdb)を使用してください。 –

+0

私は情報が十分ではないと思う。この行コードから、私は最後に割り当て解除されないuserLookupWSしか知りませんので、メモリリークが発生します。 – AechoLiu

答えて

1

なぜ変数に格納されたオブジェクトにinitWithUsername:を送信していますか?そこにあるallocの結果を直接渡すべきです(userLookupWS = [[SomeClass alloc] initWithUsername:…])。既存のインスタンスを再初期化しないでください。

init…メソッドは、インスタンスごとに1回しか呼び出されないことを前提に書かれているため、initWithWhatever:メッセージをすでに初期化されたインスタンスは、そのインスタンスが所有するすべてのものをリークします。

まず最初にそれをしない以外は、それを修正する良い方法はありません。既に初期化されたインスタンスにメッセージinitを送信しないでください。これを避ける最も簡単な方法は、alloc[[SomeClass alloc] init…])の戻り値に直接メッセージinitを送信することです。

そして、もちろん、何でもallocが返ってきたら、あなたは解放しなければなりません。起こることを確実にする最も簡単な方法は、オブジェクトを即座に自動解放することです:[[[SomeClass alloc] init…] autorelease]

+0

ピーターの返事をありがとう。それは理にかなっている。私は説明したようにステップを踏んで、メモリリークを100%から9%に減らした。これをさらに調査すると、CFStringCreateWithFormatAndArgumentsAuxからリークが発生しています。 NSString stringWithFormat:@ "%@%@" ...私はそれらを別々に割り当ててからそれを解放すべきだと思いますか? – Accilies

+0

あなたは私に何を求めているのか分かりません。それは割り当てではありません。これは、リークされた文字列か、 'CFStringCreateWithFormatAndArgumentsAux'によって割り当てられた文字列ですか? –

+0

返答ありがとうございますピーター、私の質問には、私のコードから、NSSTRING * AA = [[NSSTRING ALLOC] INITWITHFORMAT ...]を実行し、このAAを次のように使用してください: [userLookupWS initWithUsername :AA ...などこれは、NSSTRINGとのメモリリークの問題の任意の違いを作るでしょうか? – Accilies

0

initxxxメソッド名オブジェクトを使用すると、そのオブジェクトを解放していない場合はそうです、あなたがメモリリークを得ることができ、自由にそれはあなたの責任です返されることを示唆しています。

関連する問題