2016-02-01 95 views
1

線程1:在for:in循環中重新分配NSArray指針是否安全?

self.array = [[NSMutableArray alloc] init]; 
/* load array */ 

線程2:

for (NSObject* object in self.array) { 
    /* do stuff */ 
} 

這安全嗎?在for:in循環中何時以及經常訪問self.array?

如果我重新分配self.array,在循環過程中,線程2是否會繼續和平地循環舊的實例,還是會切換到新的實例,可能會導致突變異常?

回答

1

for/in循環中,集合是一個表達式。在你的情況下,該表達式是self.array。程序在循環開始時計算一次該表達式的值。在你的情況下,它在循環開始時調用self.array一次。

在循環執行期間,您可以安全地用另一個數組替換self.array

不能 do是在循環執行時就地修改數組。也就是說,你不能用另一個元素替換一個元素,或者添加一個元素,或者刪除一個元素。如果你這樣做,你會得到一個運行時錯誤(因爲NSArray中的NSFastEnumeration實現明確檢查了突變)。

+0

我剛剛運行了一些測試,證明了這一點。但是,在進一步思考時,我認爲真正的問題是舊的實例現在將被釋放,並且循環將訪問已發佈的對象。 – aepryus

+1

ARC將在循環開始時保留'self.array'返回的對象,並在循環結束時釋放它。 –

+0

哇,很好。所以我不需要將它投射到當地強指針呢? – aepryus