1.對於strong:該對象強引用delegate,外界不能銷毀delegate對象,會導致迴圈引用(Retain Cycles) 因為我們一般代理的都是當前的控制器 比如scrollView.delegate = self;這時候就成了上面的一個圈的迴圈引用。如果上圖delegate為強指針,那麼 ...
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。