2012-04-30 19 views
0

私は、以下のように私のsqliteクエリコードを実行しています。インストゥルメントは、NSDictionaryのallocおよびrelease行(whileループの内側)でメモリリークをキャッチします。誰かがそれらのalloc/releaseで間違っていることを指摘できますか?sqlite3 NSDictionaryメモリリーク

- (NSMutableArray *)executeQuery:(NSString *)sql arguments:(NSArray *)args { 
    sqlite3_stmt *sqlStmt; 

    if (![self prepareSql:sql inStatament:(&sqlStmt)]) 
     return nil; 

    int i = 0; 
    int queryParamCount = sqlite3_bind_parameter_count(sqlStmt); 
    while (i++ < queryParamCount) 
     [self bindObject:[args objectAtIndex:(i - 1)] toColumn:i inStatament:sqlStmt]; 

    NSMutableArray *arrayList = [[NSMutableArray alloc]init]; // instrument marks leak 0.1 % on this line 
    NSUInteger rcnt= arrayList.retainCount; 
    int columnCount = sqlite3_column_count(sqlStmt); 
    while ([self hasData:sqlStmt]) { 
     NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; // instrument marks leak 13% on this line 
     for (i = 0; i < columnCount; ++i) { 
      id columnName = [self columnName:sqlStmt columnIndex:i]; 
      id columnData = [self columnData:sqlStmt columnIndex:i]; 
      [dictionary setObject:columnData forKey:columnName]; 
     } 
     [arrayList addObject:dictionary]; 
     [dictionary release];// instrument marks leak 86.9 % on this line 
    } 

    sqlite3_finalize(sqlStmt); 
    rcnt=arrayList.retainCount; 
    return arrayList ; 
} 

ヘルプ/ポインターは大変ありがとうございます。数日間このことに苦しんできました。

答えて

0

あなたはARCを使用していない場合、私はあなたのリターンラインがために変更を提案:そうでなければ、おそらく完全なのArrayListをリークしている

return [arrayList autorelease]; 

+0

ありがとうございました。 arraylistでautoreleaseを試みると、プログラムは "割り付け解除されたインスタンスに送られたメッセージ"でクラッシュします。 arrayListをどこか別の場所に公開していますか? – zolio

+0

おそらく、あなたはexecuteQueryの外側に保持/解放のプロパティがないことを意味します:引き数: 関数によって返された配列を保持していることを確認し、完了したら解放します。 戻り値の自動返却は、関数内の正しいアクションです。したがって、エラーは表示された機能の外にある可能性があります。 – fsaint