通知、代理、block 是iOS中的三大回調方式。
通知
NSNotificationCenter,它就像一個廣播基站,發送一條消息,在所有的添加監聽的地方都能夠收到此信息,并作出不同或者著相同的動作,范圍更廣大,功能更強大
特點:“一對多”,“多對一”關系;通知的發送者根本不管接受者是否接受到了通知,也不管接收到通知后做什么操作,只管發,發送之后就跟他沒什么關系了。
場景:一對多傳值、跨控制器傳值,關系層次比較深的兩個對象通信,還有就是 全局廣播屬性和權限機制(鍵盤回收,程序進入后臺等)
注意點:觀察者對象在釋放前一定要將通知中心注銷掉,否則將出現不可預見的crash;一旦消息的接受者過多,就難以控制,可能有你不希望的對象接受了消息并做了處理
優點:使用簡單,解決了同時向多個對象監聽相應的問題,傳值方便快捷
缺點:無法檢測到通知中心是否正在處理接受的消息;調試時很難跟蹤動作;消息發送者在發送消息的時候不能獲取任何反饋信息等。
代理
代理幾乎是iOS開發中最常用的回調方式,在項目中的AppDelegate就是使用的這種設計模式,不僅如此,還有很多原生的控件也使用的這種設計模式,比如:UITextFiled,UITableView等等。
特點:“一對一”,對同一個協議,一個對象只能設置一個delegate;代理注重過程信息的傳輸,如,消息是否發送到,是否收到消息,消息是否發送完畢等
場景:公共接口、方法較多選用delegate進行解耦如,AFNetworking等;UI事件響應,如UITableViewDelete,UITextViewDelete等
注意:單例對象不能用delegate;代理執行協議方法時,要先檢測代理對象是否為nil,并用respondsToSelector檢測其代理是否符合協議(檢查對象能否響應指定的消息),以避免代理在回調時因為沒有實現方法而造成程序崩潰
優點:減少代碼耦合,使事件監聽和事件處理相分離;語法定義清晰,減少維護成本,代碼可讀性較強等
缺點:實現委托的代碼過程比較繁瑣;跨層傳值監聽將會加大代碼的耦合性,并且使程序的層次結構變得混亂;當多個對象同時傳值響應時,delegate的易用性大大降低;多彈窗時代理需要區別來源。
block
block是一個能夠訪問其他函數內部變量的函數,不論是原生的框架還是第三方的框架,我們都可以看到Block的身影,Block強大的功能性和易用性使得深受架構師的喜愛。
特點:"一對一"關系;注重結果,只關注是否成功。
場景:UIVIew動畫;數據請求回調;枚舉回調;GCD等
注意:防止循環引用
優點:語法簡潔,代碼緊湊;增強代碼的可讀性和可維護性;配合GCD可以很好地解決多線程問題;多彈窗時,block在創建時就區分了來源;
缺點:容易造成內存泄露;容易造成循環引用;