2015-05-05 19 views
3

我正在閱讀最新的書籍,並穿過ARC部分。它解釋了這兩個ARC預選賽:爲什麼如果一個對象在銷燬時爲零是很重要的?

:弱表示該對象不應該被保留(不增加保留計數)。 編譯器將在 銷燬之前設置爲零。

__unsafe__unretained:同弱,但它被摧毀之前對象未設置爲零。

我的問題是,爲什麼重要的是對象被設置爲零或不被銷燬?如果autorelease池擺動並釋放被銷燬的對象,則不再在內存中使用它。那麼,爲什麼在對象被銷燬之前將對象設置爲零呢?我想到的唯一情況是,如果它是一個單...

回答

3

你問:

我的問題是,爲什麼會不管是對象設置爲nil或者不是它的毀滅之前?

它不是設置爲nil的「對象」,而是引用該對象的weak變量。假設您有兩個對某個對象的引用,一個爲strong,另一個爲weak。假設您刪除strong參考(例如,將該變量設置爲nil)。現在對象沒有更強的引用,因此它將被釋放。 weak引用的美妙之處在於,現在對象已被釋放,弱引用也將被設置爲nil,確保您不會意外嘗試使用該內存,即使它早已被釋放並可能被其他用戶重用目的。

與此相反,assignunsafe_unretained行爲:該對象被釋放後,如果你有一些其他assign參考它,引用的將是不變的,指向一個被釋放的內存(這被稱爲「懸擺指針「,指出一些不存在的東西)。

2

From this SO answer:

__unsafe_unretained將繼續指向其中一個對象是內存,它釋放後也。這可能會導致因訪問該已釋放對象而導致崩潰。

你總是會使用弱點,因爲它比__unsafe_unretained(因此名稱)更安全。 Also from the same thread:

__unsafe_unretained可用於定義NSString常量等的C數組,例如, NSString __unsafe_unretained * myStrings = {@「Foo」,@「Bar」,@「Baz」,nil};

相關問題