2011-06-04 46 views
1

任何人都可以幫我解釋爲什麼這段代碼在泄漏,我們該如何處理它?iphone:從數據庫中讀取循環數據時發生內存泄漏

const char *sqlStatement = "SELECT * FROM VIOLATIONS_TBL"; 

sqlite3_stmt *compiledStatement; 

if (sqlite3_prepare(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 

    while (sqlite3_step(compiledStatement) == SQLITE_ROW) { 

     NSString *recSTR=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
     [self.pickerList addObject:recSTR]; 
     [recSTR release]; 
     recSTR=nil;    

    } 
} 

recSTR泄漏在這種情況下,我已經嘗試了所有的下面提到的解決方案,但沒有提前

+0

pickerList是數組的數組和內部數組包含一個字符串。因此,tempRowArray的保留計數爲1,否則pickerList將指向無效的引用。釋放或清除pickerList應該放棄所有tempRowArrays。泄漏在哪裏? – Kay 2011-06-04 08:41:23

回答

3

如果你的循環運行了很多次,然後使用自動釋放池

loop {
NSAutoreleasePool * innerPool = [[NSAutoreleasePool alloc] init];

...code goes here... 

[innerPool release]; 

}

它可以幫助您防止內存泄露

+1

autorelease池如何防止泄漏?它僅用於放棄不應在當前池範圍內解除分配的對象的所有權。它不是一個神奇的垃圾收集器。 – JustSid 2011-06-04 10:04:42

+1

每次autorelease被髮送到一個對象時,它都被添加到最外層的自動釋放池中。當池被耗盡時,它只會將釋放發送到池中的所有對象。 – DivineDesert 2011-06-04 10:19:52

+0

酒窩:我知道autorelease池是什麼,它仍然不會修復OP泄漏... – JustSid 2011-06-04 10:56:48

0

工作 感謝名單得到了解決泄漏是在這裏

[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)] 

處理這個問題,我們完成

+0

請分享您的完整解決方案..您是如何處理這個問題的?這對社區有幫助 – PHP 2011-06-04 08:42:39

+0

您是否更改過原始問題?當我試圖找到您在問題中發佈的代碼中的泄漏時,會引起混淆。 (字符*)sqlite3_column_text(compiledStatement,1)] – dasdom 2011-06-04 18:45:50

+0

@PHP:HE has used'[NSString stringWithUTF8String :(char *)sqlite3_column_text(compiledStatement,1)] '行而不是'NSString * recSTR = [[NSString alloc] initWithUTF8String: ];'一個 – rptwsthi 2011-06-10 10:26:38