天天看點

iOS面試題(二)

1.說說響應鍊

答: 事件響應鍊。包括點選事件,畫面重新整理事件等。在視圖棧内從上至下,或者從下之上傳播。

可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了

嚴重懷疑題目出到越後面就越籠統。

可以從責任鍊模式,來講通過事件響應鍊處理,其擁有的擴充性

2.什麼時候使用nsmutablearray,什麼時候使用nsarray?

答:當數組在程式運作時,需要不斷變化的,使用nsmutablearray,當數組在初始化後,便不再改變的,使用nsarray。需要指出的是,使用nsarray隻表明的是該數組在運作時不發生改變,即不能往nsaarry的數組裡新增和删除元素,但不表明其數組內的元素的内容不能發生改變。nsarray是線程安全的,nsmutablearray不是線程安全的,多線程使用到nsmutablearray需要注意。

3.什麼是簡便構造方法?

答:簡便構造方法一般由cocoatouch架構提供,如nsnumber的 + numberwithbool: + numberwithchar: + numberwithdouble: + numberwithfloat: + numberwithint:

foundation下大部分類均有簡便構造方法,我們可以通過簡便構造方法,獲得系統給我們建立好的對象,并且不需要手動釋放。

4.在項目什麼時候選擇使用gcd,什麼時候選擇nsoperation?

答: 項目中使用nsoperation的優點是nsoperation是對線程的高度抽象,在項目中使用它,會使項目的程式結構更好,子類化nsoperation的設計思路,是具有面向對象的優點(複用、封裝),使得實作是多線程支援,而接口簡單,建議在複雜項目中使用。

項目中使用gcd的優點是gcd本身非常簡單、易用,對于不複雜的多線程操作,會節省代碼量,而block參數的使用,會是代碼更為易讀,建議在簡單項目中使用。

5.什麼是block

答: 對于閉包(block),有很多定義,其中閉包就是能夠讀取其它函數内部變量的函數,這個定義即接近本質又較好了解。對于剛接觸block的同學,會覺得有些繞,因為我們習慣寫這樣的程式main(){ funa();} funa(){funb();} funb(){…..}; 就是函數main調用函數a,函數a調用函數b… 函數們依次順序執行,但現實中不全是這樣的,例如項目經理m,手下有3個程式員a、b、c,當他給程式員a安排實作功能f1時,他并不等着a完成之後,再去安排b去實作f2,而是安排給a功能f1,b功能f2,c功能f3,然後可能去寫技術文檔,而當a遇到問題時,他會來找項目經理m,當b做完時,會通知m,這就是一個異步執行的例子。在這種情形下,block便可大顯身手,因為在項目經理m,給a安排工作時,同時會告訴a若果遇到困難,如何能找到他報告問題(例如打他手機号),這就是項目經理m給a的一個回調接口,要回掉的操作,比如接到電話,百度查詢後,傳回網頁内容給a,這就是一個block,在m交待工作時,已經定義好,并且取得了f1的任務号(局部變量),卻是在當a遇到問題時,才調用執行,跨函數在項目經理m查詢百度,獲得結果後回調該block。

6.block 實作原理

答: objective-c是對c語言的擴充,block的實作是基于指針和函數指針。

從計算語言的發展,最早的goto,進階語言的指針,到面向對象語言的block,從機器的思維,一步步接近人的思維,以友善開發人員更為高效、直接的描述出現實的邏輯(需求)。

使用執行個體

cocoatouch架構下動畫效果的block的調用

使用typed聲明block

typedef?void(^didfinishblock)?(nsobject?*ob);

這就聲明了一個didfinishblock類型的block,

然後便可用

@property?(nonatomic,copy)?didfinishblock?finishblock;

聲明一個blokc對象,注意對象屬性設定為copy,接到block 參數時,便會自動複制一份。

__block是一種特殊類型,

使用該關鍵字聲明的局部變量,可以被block所改變,并且其在原函數中的值會被改變。

7.關于block

答: 面試時,面試官會先問一些,是否了解block,是否使用過block,這些問題相當于開場白,往往是下面一系列問題的開始,是以一定要如實根據自己的情況回答。

1). 使用block和使用delegate完成委托模式有什麼優點?

首先要了解什麼是委托模式,委托模式在ios中大量應用,其在設計模式中是擴充卡模式中的對象擴充卡,objective-c中使用id類型指向一切對象,使委托模式更為簡潔。了解委托模式的細節:

ios設計模式—-委托模式

使用block實作委托模式,其優點是回調的block代碼塊定義在委托對象函數内部,使代碼更為緊湊;

适配對象不再需要實作具體某個protocol,代碼更為簡潔。

2). 多線程與block

gcd與block

使用 dispatch_async 系列方法,可以以指定的方式執行block

gcd程式設計執行個體

dispatch_async的完整定義

void?dispatch_async(

dispatch_queue_t?queue,

dispatch_block_t?block);

功能:在指定的隊列裡送出一個異步執行的block,不阻塞目前線程

通過queue來控制block執行的線程。主線程執行前文定義的 finishblock對象

dispatch_async(dispatch_get_main_queue(),^(void){finishblock();});

8.談談object-c的記憶體管理方式及過程?

答: 1).當你使用new,alloc和copy方法建立一個對象時,該對象的保留計數器值為1.當你不再使用該對象時,你要負責向該對象發送一條release或autorelease消息.這樣,該對象将在使用壽命結束時被銷毀.

2).當你通過任何其他方法獲得一個對象時,則假設該對象的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確定該對象被清理.如果你打算在一段時間内擁有該對象,則需要保留它并確定在操作完成時釋放它.

3).如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數相等.

繼續閱讀