天天看點

delegate assign weak應該用哪個,避免EXC_BAD_ACCESS

隻考慮ARC環境:自己寫的delegate,使用weak,不用assign。

weak和assign的差別,當指向的對象被釋放掉之後,weak指針會自動置為nil。而assign指針會指向一個無效的位址。   在異步環境下,經常會遇到異步回調的時候調用delegate的回調方法, [self.delegate callbackMethod], 如果delegate屬性是assign,如果這個時候delegate指向的執行個體已經被銷毀了,就會EXC_BAD_ACCESS,而weak屬性是對nil發消息,不會crash。   由于系統庫例如UITableView之類的的代理還是使用的assign屬性,是以良好的程式設計習慣是,在代理執行個體析構的時候,将uitableview的代理設定為nil,這樣可以解決crash問題。

MyUITableViewController
 
- (id)init {
self.tableView.delegate = self;
}
- (void)dealloc {
self.tableView.delegate = nil;
}      

轉載于:https://www.cnblogs.com/gabrialrx/p/4801499.html