2011-01-18 7 views
3

私はこれらの行のための器具でメモリリークの警告を取得しています:ここで メモリリーク使用してsqliteの

NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; 

year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 

は、このセクションのコードです:

-(NSMutableArray *)selectUsersList:(NSString *)condition:(NSString *)sort 
{ 
    NSMutableArray *users = [[NSMutableArray alloc] init]; 

    if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK) 
    { 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 
    else 
    { 
     NSString *query = @"SELECT * FROM users"; 
     if (condition != nil) 
     { 
     NSString *newQuery = [NSString stringWithFormat:@"%@ %@", query, condition]; 
     query = newQuery; 
     } 
     if (sort != nil) { 
     NSString *newsort = [NSString stringWithFormat:@"%@ %@", query, sort]; 
     query = newsort; 
     } 
     sqlite3_stmt *statement; 

     if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) 
     { 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; 
      } 
      NSString *year= @""; 
      if (sqlite3_column_text(statement, 2) != nil) 
      { 
       year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)]; 
      } 

      User *user = [[User alloc] initWithName:name year:year]; 

      [users addObject:user]; 
      [user release];    
     } 
    } 
    sqlite3_finalize(statement); 
    sqlite3_close(database); 
    } 
    return users; 
} 

私は空の文字列を提示したいと私は空の文字列に最初に年を設定しているので、ビューに 'nil'ではありません。これを行うより良い方法はありますか?このリークをどのように解決できますか?

ありがとうございました!

+0

'@" "'は漏れません。それはあなたの問題の原因ではないので、それについて心配しないでください。 –

+0

なぜ私はリークを起こしているのですか? – Danamo

+1

私の答えを見てください。あなたは 'ステートメント'を漏らしているように見えます。 –

答えて

5

whileループの後に、sqlite3_finalize()でsqlite3ステートメントのメモリをクリアする必要があります。従って:

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; 

     NSString *year= @""; 
     if (sqlite3_column_text(statement, 1) != nil) { 
      year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 
     } 

     User *user = [[User alloc] initWithName:name year:year]; 
     [users addObject:user]; 
     [user release]; 
    } 
    sqlite3_finalize(statement); // DO THIS 
} 
+0

私はsqlite3_finalize(ステートメント)を使用しています。それでもリーク警告が出ています。私はsqlite3_reset(ステートメント)を使うべきですか?同じように? – Danamo

+0

する必要はありません。あなたが見ている正確な警告は何ですか? –

+0

それは、リークオブジェクトがUser、複数のアドレスで、私はこの行のUserクラスで別のリークを受け取っていると言います。 self.first = [self.name substringWithRange:NSMakeRange(0、1)]; – Danamo

関連する問題