iOS 關於修飾代理用weak還是assign


1.對於strong:該對象強引用delegate,外界不能銷毀delegate對象,會導致循環引用(Retain Cycles)

因為我們一般代理的都是當前的控制器 比如scrollView.delegate = self;這時候就成了上面的一個圈的循環引用。如果上圖delegate為強指針,那么也就是UIViewController和scrollView的retainCount 永遠最少都為1,所以有強指針指向的那個對象就不會銷毀,這就造成了內存泄露。所以要想避免這種內存泄露,也就是避免像上述情況那種的循環引用,必須delegate為弱指針,這樣,當UIViewContrller運行完自己的作用域要銷毀時,發現沒有強指針指向自己,並且retainCount=0,所以它就自動銷毀了,而它指向的UIView也就沒有了強指針指向,所以retainCount=0,所以也銷毀了,這樣NSArray也銷毀了,最后scrollView也銷毀了,就避免了內存泄露的問題。

2.對於assing:也有weak的功效。但是網上有assign是指針賦值,不對引用計數操作,使用之后如果沒有置為nil,可能就會產生野指針;而weak一旦不進行使用后,永遠不會使用了,就不會產生野指針。

經過一番研究,發現如果使用

@property (nonatomic, assign, readwrite) id delegate;

聲明一個delegate,那么即便delegate指向的對象銷毀了,delegate中依然會保存之前對象的地址,即delegate成為了一個野指針...

 

3.對於weak:指明該對象並不負責保持delegate這個對象,delegate這個對象的銷毀由外部控制。

而使用weak,則不會有上述問題,當delegate指向的對象銷毀后,delegate = nil,

所以答案就是,使用weak。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM