2010-12-07 20 views
0

どのように私はスニペットを次の中からdataArrayを解放し、メモリリークの問題?

+(NSMutableArray *)getData: (NSString *)dbPath 
{ 

    NSMutableArray *_dataArray = [[NSMutableArray alloc] init]; 
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     NSString *sqlQuery = [NSString stringWithFormat:@"SELECT DISTINCT name FROM databaseTable"]; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &selectstmt, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(selectstmt) == SQLITE_ROW) 
      { 
       [_dataArray addObject:[NSString stringWithFormat:@"%d", sqlite3_column_int(selectstmt, 0)]]; 
      } 
     } 
     sqlite3_finalize(selectstmt); 
    } 
    sqlite3_close(database); 
    return _dataArray; 
} 

上記の方法は、私のメモリリークを与え、それが私のアプリケーションの将来の作業に深刻な問題を取得します。

答えて

3

保持されているオブジェクトを返す場合は、命名規則に従うことでクリアする必要があります。新しいメソッド、作成するメソッド、またはコピーするメソッドから始める必要があります。それ以外の場合は、自動解放されたオブジェクトを返す必要があります。

+0

+1推奨される命名規則に従ってください。 – cbranch

1

投稿したコードに明らかなリークは見られません。この関数は、割り当てられたNSMutableArrayを返しているので、呼び出し側は後でreleaseを呼び出す責任があります。または、これをautoreleaseオブジェクトにすることもできます。

はまた、あなたはおそらくsqlite3_open場合のみ)sqlite3_closeを(呼び出したい()(最初if文の中に、すなわち、移動sqlite3_close())成功しました。 sqlite3_finalize()と同じ考えです。

SQLiteは暗黙のうちに一度だけ初期化されますが、それについて心配する必要はありません。次のドキュメントを確認してください:

int sqlite3_initialize(void); 
int sqlite3_shutdown(void); 

どのような種類のオブジェクトがリークとして報告されていますか?

関連する問題