2011-08-13 55 views
0

我正在使用NSMutable字符串從數據庫查詢中獲取一個字符串。我用@「」分配變量,然後填充,如果從數據庫中找到。我試過添加autorelease/release,但是這會引發數據庫調用的問題。Obj-C,內存泄漏混淆

有人能指出我的錯誤嗎?

我會輸入這段代碼,但我覺得分析器箭頭很有用。

enter image description here

回答

2

你創建一個自動釋放的NSMutableString和分配指針strDBAAppVer指向它。但你扔掉引用該對象,並獲得指針strDBAppVer指向一個新的對象,一個NSString與我認爲你想要的是1.

一個保留計數內if語句是你的事像這樣:

NSString* databaseField = [[NSString alloc] initWithUTF ...etc.] 
[strDBAppVer setString: databaseField]; 
[databaseField release]; 
1

strDBAppVer是第一組到[NSMutableString stringWithString:@""],這是合理的,存儲器,明智的。不過,後來,你完全變量重新設置爲一個整體不同的對象,通過alloc/initWithUTF8String:創建,使strDBAppVer 有時點到一個已經自動釋放對象,有時(當if說法是正確的)指向保留計數爲+1的對象。

這就是爲什麼有泄漏,但釋放導致問題。如果if聲明爲真,則您已將變量設置爲指向具有+1計數的對象,如果該值爲false,則將變量設置爲指向具有0計數的完全不同的對象。

這看起來像我對混淆可變字符串。你是否知道,至少在發佈的代碼中,你實際上沒有變異strDBAppVer?試試這個:

NSString* strDBAppVer = @""; 

然後,你的if語句中,

strDBAppVer = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statementAppVer,0)]; 
//Now, realizing that strDBAppVer has just been reassigned to point 
//to an entirely new object, one created with alloc/init, and therefore one that 
//needs to be released, 
[strDBAppVer autorelease]; 

注意自動釋放​​只是if語句裏面,所以它不小心overrelease你原來的@""值。 (由於常量字符串不應該被釋放)。