1. 程式人生 > >2017iOS面試經典總結(1)--- iOS 代理,通知,Block

2017iOS面試經典總結(1)--- iOS 代理,通知,Block

作為我們這個行業,面試對於我們並不陌生,而且作為技術工種,技術面試是面試中的重要環節,我最近會總結一些比較基礎但是平時總結較少的面試經典的題。也是全面的學習,也可以讓面試的朋友們相互分享交流。
1.三者的傳值對應關係。
我們說通知是”一對多”的關係。
而代理和Block通常是”一對一”的關係。
Block的對應關係與代理機制一樣,Block更為靈活。

2.通知的釋放問題。
我們都知道,通知和定時器,我們需要手動釋放,否則會造成記憶體洩漏,我們看到網上有說通知的釋放可以在dealloc方法中進行釋放,這個是沒有錯的,但是在實際的開發中,我們在不同的實際需求,釋放的方法是不一樣的。
例如:現在A介面是在不斷的接受通知。此時A跳到B介面,而在B介面中不需要A通知的事件,如果在A介面中將通知的釋放寫在dealloc中,跳到B介面,不會執行A介面中的dealloc方法。所以A介面仍然不斷的接收著訊息。所以這種需求,就應該講A中的通知釋放寫在viewDidDisapper方法中。

3.代理和Blcok的修飾關鍵字
(1)代理的修飾詞用weak關鍵字,為什麼不能用strong呢?
答:因為,代理方會強行持有代理屬性,而此時代理屬性用strong的話,會造成迴圈引用。用weak解迴圈
(2)那代理為什麼不用assgin關鍵字呢?
答:因為weak修飾的物件,在釋放的時候會被置為nil,而oc向nil傳送訊息是沒問題的,但是用assign就會造成野指標的錯誤unrecongnized selected send to instance.
(3)為什麼Block用copy 關鍵字?
答:Block在沒有使用外部變數時,記憶體存在全域性區,然而,當Block在使用外部變數的時候,記憶體是存在於棧區,當Block copy之後,是存在堆區的。知道了這些之後,就不難解釋為什麼Block要用copy修飾,因為存在於棧區的特點是物件隨時有可能被銷燬,一旦銷燬在呼叫的時候,就會造成系統的崩潰。所以Block要用copy關鍵字。

4.代理和Block的效率對比。
通過兩者關鍵字的比較,Block的效率會低於代理,因為Block要做棧堆的拷貝。

5.兩者對事件的處理對比。
代理更加註重事件的過程,而Block更注重事件處理的結果。

6.使用兩者的情形。
在多訊息傳遞的時候,使用代理更清晰,而Block顯得不直觀也不易維護。
如果委託方向呼叫多個代理物件的時候,使用Block。因為一個委託物件的代理屬性只有一個(weak修飾)。代理修改的是代理本身。