delegate 用assign還weak?
阿新 • • 發佈:2019-01-28
屬性關係有兩種主要型別:strong和weak,相當於非ARC環境裡的retain和assign。只要存在一個強引用,物件就會一直存在,不會被銷燬。強引用類似於C++中的shared_ptr,只不過管理引用計數的程式碼是在編譯時生成的,而shared_ptr是在執行時通過操作符過載確定的。
weak屬性的變數是不為其所屬物件持有的,並且在該變數被銷燬之後,此weak變數的值會自動被賦值為nil。
而assign屬性一般是對C基本資料型別成員變數的宣告,當然也可以用在物件型別成員變數上,只是其代表的意義只是單純地拷貝所賦值變數的指標。即如果對某assign成員變數B賦值某物件A的指標,則此B只是簡單地儲存此指標的值,且並不持有物件A,也就意味著如果A被銷燬,則B就指向了一個已經被銷燬的物件,如果再對其傳送訊息會引發崩潰。 Objective-C中一直存在迴圈引用的問題,但在實際應用中很少出現迴圈引用。對於過去那些使用assign屬性的地方,在ARC環境中要使用weak代替。大部分引用迴圈是由委託(delegate)引起的,所以應該總是把delegate屬性宣告為weak。當引用的物件被銷燬之後,weak引用會被自動置為nil,與assign相比這是一個巨大的進步,因為assign可以指向被釋放掉的記憶體,導致程式崩潰