當1。弱修改壹個變量,它意味著指針變量可以使用但不擁有對象;和弱引用指向壹個對象,則該對象的引用計數不會增加。
當弱引用壹個對象時,運行時會將被引用的信息(key是指向該對象的指針,value是弱指針的變量的地址數組)封裝到weak_entry_t結構中,並將其存儲在已棄用的ptr類中。
OC的運行時維護壹個弱表(weak_table_t結構),用於維護所有指向對象的弱指針,這是weak _ entry _ t結構上的壹層封裝。
weak_table_t類型的結構是哈希表,但是該表中的操作不是線程安全的。
於是運行時在weak_table_t上又多了壹層封裝,就是SideTable對於弱引用機制的SideTable封裝的主要目的是為了解決線程安全的問題。
Weak_entry_t是weak _ table _ t存儲的特定數據類型。
DisguisedPtr & ltT & gt是運行時對壹個公共對象指針(引用)的封裝,旨在隱藏weak _ table _ T的內部指針。
RefcountMap用於OC的引用計數機制;Slock其實就是os _ unfair _ lock _ s類型,用來處理線程安全的。Weak_table弱引用表,用於存儲對象的弱引用數組。SideTable提供的方法都和鎖有關。
Strong:該對象強引用delegate,引用計數為+1。外界不能破壞委托對象,這將導致保留周期。
弱:指示對象不持有委托對象,委托的銷毀由外部控制。當delegate指向的對象被銷毀時,自動delegate = nil。
賦值:有弱的效果,但是需要手動設置為nil。
為什麽用弱賦值而不用賦值?
賦值是指針賦值,不操作引用計數。如果委托在使用後未設置為nil,則可能會生成通配符指針;壹旦由weak指向的委托被用完,它將自動歸零,並且不會產生通配符指針。
賦值:通常修改值類型的屬性;
Strong:修改引用類型的屬性,內存計數+1;
弱:修改引用類型的屬性。原理見上面的解釋。但是雖然不持有由weak修飾的屬性,但是在釋放對象時會查詢並釋放其對應的弱引用表,這樣會增加內存和性能開銷。
弱者(OC運行時的3(3)
弱者(OC運行時的2(2)
OC運行時弱(1)