我已經使用了靜態分析器來查看我的代碼,並且已經到了以下問題。init,alloc和retain並且「初始值永遠不會被讀取」
NSString *string = [[NSString alloc] init];
string = [object name];
這給我一個內存錯誤,說沒有讀取初始值。 我用下面的代碼替換它
NSString *string = [[object name]retain];
這是更好還是更正確的編碼?
乾杯
我已經使用了靜態分析器來查看我的代碼,並且已經到了以下問題。init,alloc和retain並且「初始值永遠不會被讀取」
NSString *string = [[NSString alloc] init];
string = [object name];
這給我一個內存錯誤,說沒有讀取初始值。 我用下面的代碼替換它
NSString *string = [[object name]retain];
這是更好還是更正確的編碼?
乾杯
我看到有人做這件事。 NSString *string = [[NSString alloc] init];
創建一個新對象並將其分配給字符串。 string = [object name];
將名稱object
指定給字符串。它類似於說int a = 0; a = 4
,0
對4
沒有影響。你的代碼的問題是,[[NSString alloc] init]
創建一個保留計數爲1的新對象,因爲你不釋放它泄漏。 [object name]
返回一個自動釋放的對象,它將在runloop結束時消失。
總之,使用NSString *string = [[object name] retain];
此代碼:
1: NSString *string = [[NSString alloc] init];
2: string = [object name];
不正確,因爲在行1:你分配在可變string
新的內存和存儲引用。在行2:你存儲變量string
引用另一個內存位置。
因此,您沒有閱讀在1:甚至沒有release
分配的內存值。所以你還有內存泄漏。
如果你想保存對內存中某個地方的引用,你不需要alloc+init
。當你想在你要寫數據或從中讀取數據的內存中分配一些空間時,你應該使用alloc+init
。
你的可變string
實際上是一個指針到NSString
對象。代碼的第一行創建了一個新的空字符串,併爲其指定了一個指向string
的指針。第二行代碼立即用指向完全不同字符串的指針覆蓋該指針。您從未讀過原始值,也無法訪問分配的NSString
,因此它已經泄漏。
第二個選項是正確的。,假如你稍後釋放/ autorelease它。