2011-12-13 81 views
2

我使用的代碼片段像ARC是否支持myiVar = nil?

if ([Array count] != 0) { 
    Array = nil; 
} 
Array = [[NSMutableArray alloc]init]; 

這是使用ARC時允許嗎?這是否會導致任何類型的崩潰?爲什麼我這樣做是每次當我的方法被調用Array獲得一組新的數據。我在我班的許多地方都使用這種片段。

+3

簡單的建議你的編碼風格(和挑剔挑剔)。在ObjC開發人員社區似乎有一個協議,變量名稱以小寫字母開頭,類名以大寫字母開頭。在變量名中使用大寫的第一個字母會使其他開發人員更難以閱讀您的代碼。 –

+1

在將數組分配給新的NSMutableArray之前,您甚至不需要將該數組設置爲nil。當一個變量被賦值時,它的舊值在它獲得新值之前被釋放。 –

回答

10

ARC一邊,操作是毫無意義的。你分配一個伊維爾nil然後立即分配到別的東西。這與將它分配給別的東西沒有什麼不同。

在ARC之前,如果變量具有先前的值,則會給您一個內存泄漏(無論您是否分配給nil)。用ARC不會泄漏。

+0

不太確定泄漏。如果數組不被保留,爲什麼它應該泄漏? – Alin

+0

我假設上面的代碼段會被多次調用 - 所以如果在'Array'中有一個值,它將通過alloc/init創建。 – jrturton

+0

@Alin:'-init:'調用給出一個+1保留計數。 – Dov

3

最佳解決方案:親自測試一下!這是一個非常簡短的例子!

但是,是的,這當然是有效的! ARC表示自動引用計數。它只是說你不必在乎release,retain等等。

如果你想要一個對象爲零,你​​仍然可以,因爲它是一個簡單的指針分配!

而關於你的代碼,你可以在重新指派它之前將數組設置爲零!

嘗試讓你的代碼的邏輯:

如果我陣列具有對象

Then Array point to a new nil object 

但在所有情況下,你做的事:

我的數組點一個新的NSMutableArray對象

因此,無論您的條件是否被評估爲true,您的代碼都是無用的,因爲這個變量會在之後取得另一個值!

+0

這比我的回答快得多:) – jrturton

0

您顯示的示例代碼是有效的。這裏有幾個變體:

if ([Array count] != 0) { 
    Array = [[NSMutableArray alloc] init]; 
} 

實施例2:

if ([Array count] != 0) { 
    Array = [NSMutableArray array]; //value will be retained 
} 

實施例3:

if ([Array count] != 0) { 
    self.Array = [[NSMutableArray alloc] init]; //Will NOT leak under ARC. 
} 

實施例4:

//if ([Array count] != 0) { 
[Array removeAllObjects]; 
//} 

所有四個例子是下ARC有效。

另一件事:實例變量通常首字母小寫,但仍然遵循CamelCase方法。另一種方法是在變量名稱前加一個下劃線:如果您沒有@synthesize方法來匹配@property值,則完成此操作。