2011-10-03 35 views
2

我已經使用了靜態分析器來查看我的代碼,並且已經到了以下問題。init,alloc和retain並且「初始值永遠不會被讀取」

NSString *string = [[NSString alloc] init]; 
string = [object name]; 

這給我一個內存錯誤,說沒有讀取初始值。 我用下面的代碼替換它

NSString *string = [[object name]retain]; 

這是更好還是更正確的編碼?

乾杯

回答

2

我看到有人做這件事。 NSString *string = [[NSString alloc] init];創建一個新對象並將其分配給字符串。 string = [object name];將名稱object指定給字符串。它類似於說int a = 0; a = 404沒有影響。你的代碼的問題是,[[NSString alloc] init]創建一個保留計數爲1的新對象,因爲你不釋放它泄漏。 [object name]返回一個自動釋放的對象,它將在runloop結束時消失。

總之,使用NSString *string = [[object name] retain];

3

此代碼:

1: NSString *string = [[NSString alloc] init]; 
2: string = [object name]; 

不正確,因爲在行1:你分配在可變string新的內存和存儲引用。在行2:你存儲變量string引用另一個內存位置。

因此,您沒有閱讀在1:甚至沒有release分配的內存值。所以你還有內存泄漏。

如果你想保存對內存中某個地方的引用,你不需要alloc+init。當你想在你要寫數據或從中讀取數據的內存中分配一些空間時,你應該使用alloc+init

3

你的可變string實際上是一個指針NSString對象。代碼的第一行創建了一個新的空字符串,併爲其指定了一個指向string的指針。第二行代碼立即用指向完全不同字符串的指針覆蓋該指針。您從未讀過原始值,也無法訪問分配的NSString,因此它已經泄漏。

第二個選項是正確的。,假如你稍後釋放/ autorelease它。

相關問題