簡體   English   中英

Obj-C、Memory 泄漏混淆

[英]Obj-C, Memory leak confusion

我正在使用 NSMutable String 從數據庫查詢中獲取字符串。 我已經用 @"" 分配了變量,然后如果從數據庫中找到,則填充。 我嘗試添加自動釋放/釋放,但這會導致對數據庫調用的引用出現問題。

有人可以指出我的錯誤嗎?

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

在此處輸入圖像描述

您正在創建一個自動釋放的 NSMutableString 並分配指針 strDBAAppVer 以指向它。 但隨后你丟棄了對 object 的引用,並讓指針 strDBAppVer 指向一個新的 object,一個保留計數為 1 的 NSString。

認為你想要的是在你的 if 語句中是這樣的:

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

strDBAppVer首先設置為[NSMutableString stringWithString:@""] ,這是合理的,內存方面的。 但是,稍后,您將變量完全重新設置為由alloc / initWithUTF8String:創建的完全不同的 object ,使 strDBAppVer有時指向已經自動發布的 object,有時(當if語句為真時)指向帶有 69131CBD1 的 Z9BEB668CFDEZ96保留計數+1。

這就是為什么存在泄漏但釋放會導致問題的原因。 如果if語句為真,則您已將變量設置為指向計數為 +1 的 object,如果為假,您已將變量設置為指向計數為 0 的完全不同的 object。

在我看來,這就像對可變字符串的混淆。 您是否知道,至少在發布的代碼中,您實際上並沒有改變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 語句內,因此它不會意外過度釋放您的原始值@"" (因為不應釋放常量字符串。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM