Objective-C代碼經(jīng)常出現(xiàn)一些情況,就是幾個(gè)對(duì)象都以某種方式互相引用翁授,從而形成"環(huán)"(cycle)拣播。由于Objective-C內(nèi)存管理模型使用引用計(jì)數(shù)架構(gòu),所以這種情況通常會(huì)泄露內(nèi)存收擦,因?yàn)樽詈鬀]有別的東西會(huì)引用環(huán)中的對(duì)象贮配。這樣的話,環(huán)里的對(duì)象就無法為外界所訪問了塞赂,但對(duì)象之間尚有引用泪勒,這些引用使得它們都能繼續(xù)存活下去,而不會(huì)為系統(tǒng)所回收。最簡單的保留環(huán)由兩個(gè)對(duì)象構(gòu)成圆存,它們互相引用對(duì)方叼旋。
避免保留環(huán)的最佳方式就是弱引用,這種引用經(jīng)常用來表示"非擁有關(guān)系"沦辙,將屬性聲明為unsafe_unretained夫植。通過unsafe_unretained聲明屬性,實(shí)例不再擁有它油讯,但是屬性值可能不安全详民,而且不歸此實(shí)例所擁有。如果系統(tǒng)已經(jīng)把屬性所指的那個(gè)對(duì)象回收了陌兑,那么在其上調(diào)用方法可能會(huì)使應(yīng)用程序崩潰沈跨。由于本對(duì)象并不保留屬性對(duì)象,因此其有可能為系統(tǒng)所回收兔综。
用unsafe_unretained修飾的屬性特質(zhì)饿凛,其語義同assign特質(zhì)等價(jià)。然而邻奠,assign通常只用于int笤喳、float为居、結(jié)構(gòu)體等碌宴,unsafe_unretained則多用于對(duì)象類型。這個(gè)詞本身就表明其所修飾的屬性可能無法安全使用蒙畴。
使用weak屬性贰镣,它與unsafe_unretained的作用完全相同,然而膳凝,只要系統(tǒng)把屬性回收碑隆,屬性值就會(huì)自動(dòng)設(shè)為nil。
當(dāng)指向EOCClassA實(shí)例的引用移除后蹬音,unsafe_unretained屬性仍然指向那個(gè)已經(jīng)回收的實(shí)例上煤,而weak屬性則指向nil。