2011-09-16 44 views
5

AFAIK,__block是當你改變所使用的塊,一個變量(塊之外聲明)指向的地址內。當我必須使用__block時,ARC會告訴我嗎?

但是,如果我改變什麼值的變量指向但指針保持不變?例如,如果我有NSMutableArray *array和我只是做[array addObject:object]塊裏面?在這種情況下,我不會更改指針array,但我正在更改它指向的值。那麼,我是否還必須使用__block來聲明NSMutableArray *array

回答

19

你只需要__block如果你正在改變變量的值。

I.e.如果您有:

NSArray* foo; 

您只有改變foo值需要__block。現在,請記住,foo無非是「一個指針,它的類型NSArray的事情」了。即foo實際上是一個64位或32位整數,具體取決於平臺。如果您更改該整數,則需要__block。如果你不這樣做,你不需要__block

所以,不,你不需要__block調用addObject:陣列上,因爲你實際上並沒有改變foo值。

如果你做這樣的事情foo = (expression);,那麼你需要__block

(注意,這是爲什麼OO下併發程序設計是這樣苦啊的原因之一......這是非常難以界定的「方差域」對於任何給定的執行路徑)

+0

什麼編譯器優化? '__block'可能暗示一個對象永遠不會改變,如果'NSArray'被內聯,後續的容量調用可能是錯誤的。 – Dani

+2

'__block'表示變量可以改變。無論變量是「__block」還是常量副本(默認情況下都是如此),在對象上調用方法都不會受到影響。 – bbum

+0

但是如果變量(NSArray *)是一個自己的屬性會發生什麼?是否需要添加__block? – Amnysia