2013-06-30 37 views
-1

1)維基百科表示:「弱(_ 弱)和賦值( _assign)之間的區別在於,當指向變量的對象被釋放時,變量的值是否將被更改。弱者將被更新爲零,並且指派者將保持不變,作爲懸掛指針。「__weak,__block和__assign有什麼不同?

但經過我在Xcode中嘗試了樣品這樣

__weak NSObject *obj1 = [[NSObject alloc] init]; 
[obj1 release]; 

如果維基的權利,地址OBJ1指出,必須在發佈後nill。但是obj1指向的地址仍然是0xabcdef... Wiki的錯誤?

2)幫我區分__weak, __block, __assign

+1

沒有'__assign'這樣的東西。您可以使用'assign'屬性定義屬性,但不存在像'__weak'一樣的'__assign'關鍵字。而'__block'與你的問題的主要部分完全沒有關係。 – rmaddy

+0

那麼維基的對錯? – DungLe

+0

我讀過這個話題,但我仍然不明白__weak,__block – DungLe

回答

2

__weak屬性爲「歸零弱引用」是僅適用與ARC(自動引用計數)。

您的代碼顯然是用MRC(手動引用計數)編譯的。在這種情況下, 的__weak attribute只是忽略,你應該得到一個編譯器警告

 
__weak attribute cannot be specified on an automatic variable when ARC is not enabled [-Wignored-attributes] 

因此,釋放的對象有沒有影響obj1變量本身。它是一個 懸掛指針,指向一個解除分配的實例。


如果你轉換代碼,ARC,那麼你必須刪除release聲明。 現在你會得到一個不同的警告

 
assigning retained object to weak variable; object will be released after assignment [-Warc-unsafe-retained-assign] 

對象將被釋放並obj1組立即nil,因爲有對分配後的對象沒有強引用。

相關問題