2010-12-07 117 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
return [_dataArray autorelease]; 

如果您想要返回保留對象,則需要按照命名約定進行清除。該方法應該從新建,創建或複製開始。否則,你應該返回一個自動釋放對象。

+0

+1遵循推薦的命名約定。 – cbranch 2010-12-07 13:29:04

1

我在您發佈的代碼中看不到任何明顯的泄漏。該函數返回已分配的NSMutableArray,因此調用者將負責稍後調用release。或者,您可以選擇將此設置爲autorelease對象。

此外,你可能想調用sqlite3_close()只有sqlite3_open()成功(即移動sqlite3_close()來第一if語句)。 sqlite3_finalize()的想法也一樣。

SQLite有一些一次性初始化,但你不應該擔心這一點。檢查文檔:

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

什麼類型的對象被報告爲泄漏?