我正在使用NSMutable字符串從數據庫查詢中獲取一個字符串。我用@「」分配變量,然後填充,如果從數據庫中找到。我試過添加autorelease/release,但是這會引發數據庫調用的問題。Obj-C,內存泄漏混淆
有人能指出我的錯誤嗎?
我會輸入這段代碼,但我覺得分析器箭頭很有用。
我正在使用NSMutable字符串從數據庫查詢中獲取一個字符串。我用@「」分配變量,然後填充,如果從數據庫中找到。我試過添加autorelease/release,但是這會引發數據庫調用的問題。Obj-C,內存泄漏混淆
有人能指出我的錯誤嗎?
我會輸入這段代碼,但我覺得分析器箭頭很有用。
你創建一個自動釋放的NSMutableString和分配指針strDBAAppVer指向它。但你扔掉引用該對象,並獲得指針strDBAppVer指向一個新的對象,一個NSString與我認爲你想要的是1.
一個保留計數內if語句是你的事像這樣:
NSString* databaseField = [[NSString alloc] initWithUTF ...etc.]
[strDBAppVer setString: databaseField];
[databaseField release];
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你原來的@""
值。 (由於常量字符串不應該被釋放)。