我正在閱讀最新的書籍,並穿過ARC部分。它解釋了這兩個ARC預選賽:爲什麼如果一個對象在銷燬時爲零是很重要的?
弱:弱表示該對象不應該被保留(不增加保留計數)。 編譯器將在 銷燬之前設置爲零。
__unsafe__unretained:同弱,但它被摧毀之前對象未設置爲零。
我的問題是,爲什麼重要的是對象被設置爲零或不被銷燬?如果autorelease池擺動並釋放被銷燬的對象,則不再在內存中使用它。那麼,爲什麼在對象被銷燬之前將對象設置爲零呢?我想到的唯一情況是,如果它是一個單...
我正在閱讀最新的書籍,並穿過ARC部分。它解釋了這兩個ARC預選賽:爲什麼如果一個對象在銷燬時爲零是很重要的?
弱:弱表示該對象不應該被保留(不增加保留計數)。 編譯器將在 銷燬之前設置爲零。
__unsafe__unretained:同弱,但它被摧毀之前對象未設置爲零。
我的問題是,爲什麼重要的是對象被設置爲零或不被銷燬?如果autorelease池擺動並釋放被銷燬的對象,則不再在內存中使用它。那麼,爲什麼在對象被銷燬之前將對象設置爲零呢?我想到的唯一情況是,如果它是一個單...
你問:
我的問題是,爲什麼會不管是對象設置爲nil或者不是它的毀滅之前?
它不是設置爲nil
的「對象」,而是引用該對象的weak
變量。假設您有兩個對某個對象的引用,一個爲strong
,另一個爲weak
。假設您刪除strong
參考(例如,將該變量設置爲nil
)。現在對象沒有更強的引用,因此它將被釋放。 weak
引用的美妙之處在於,現在對象已被釋放,弱引用也將被設置爲nil
,確保您不會意外嘗試使用該內存,即使它早已被釋放並可能被其他用戶重用目的。
與此相反,assign
或unsafe_unretained
行爲:該對象被釋放後,如果你有一些其他assign
參考它,引用的將是不變的,指向一個被釋放的內存(這被稱爲「懸擺指針「,指出一些不存在的東西)。
__unsafe_unretained將繼續指向其中一個對象是內存,它釋放後也。這可能會導致因訪問該已釋放對象而導致崩潰。
你總是會使用弱點,因爲它比__unsafe_unretained(因此名稱)更安全。 Also from the same thread:
__unsafe_unretained可用於定義NSString常量等的C數組,例如, NSString __unsafe_unretained * myStrings = {@「Foo」,@「Bar」,@「Baz」,nil};