你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 【面試】iOS 開發面試題(二)

【面試】iOS 開發面試題(二)

編輯:IOS開發綜合
1. 我們說的oc是動態運行時語言是什麼意思?
  答案:多態。 主要是將數據類型的確定由編譯時,推遲到了運行時。
  這個問題其實淺涉及到兩個概念,運行時和多態。
  簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
  多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;
  那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。
  也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。
  因此也可以說,運行時機制是多態的基礎?~~~


  2. 通知和協議的不同之處?
  答案:協議有控制鏈(has-a)的關系,通知沒有。
  簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。
  代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。
  只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理發布會的消息後,別稱B的
  發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。
  因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。


  3. 關於多態性
  答案:多態,子類指針可以賦值給父類。
  這個題目其實可以出到一切面向對象語言中,
  因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。
  最重要的是轉化成自我理解。


  4. frame和bounds有什麼不同?
  答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)
  bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)



  5. NSOperation queue?
  答案:存放NSOperation的集合類。
  操作和操作隊列,基本可以看成java中的線程和線程池的概念。用於處理ios多線程開發的問題。
  網上部分資料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是按照嚴格的先進現出。
  這邊又有個疑點是,對於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,
  但是Bfunc是等Afunc完全操作完以後,B才開始啟動並且執行,因此隊列的概念離亂上有點違背了多線程處理這個概念。
  但是轉念一想其實可以參考銀行的取票和叫號系統。
  因此對於A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。
  但是後來看到一票關於這操作隊列話題的文章,其中有一句提到
  “因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”
  瞬間覺得這個queue名字有點忽悠人了,還不如pool~
  綜合一點,我們知道他可以比較大的用處在於可以幫組多線程編程就好了。


  6. 什麼是延遲加載?
  答案:懶漢模式,只在用到的時候才去初始化。
  也可以理解成延時加載。
  我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
  一個延時載,避免內存過高,一個異步加載,避免線程堵塞。


  7. 是否在一個視圖控制器中嵌入兩個tableview控制器?
  答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
  只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,
  而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController
  那樣的感覺。


  8. 一個tableView是否可以關聯兩個不同的數據源?你會怎麼處理?
  答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法裡實現的。
  因此我們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。
  因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?


  9. 什麼時候使用NSMutableArray,什麼時候使用NSArray?
  答案:當數組在程序運行時,需要不斷變化的,使用NSMutableArray,當數組在初始化後,便不再改變的,使用NSArray。需要指出的是,使用NSArray只表明的是該數組在運行時不發生改變,即不能往NSAarry的數組裡新增和刪除元素,但不表明其數組內的元素的內容不能發生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意。


  10. 給出委托方法的實例,並且說出UITableVIew的Data Source方法
  答案:CocoaTouch框架中用到了大量委托,其中UITableViewDelegate就是委托機制的典型應用,是一個典型的使用委托來實現適配器模式,其中UITableViewDelegate協議是目標,tableview是適配器,實現UITableViewDelegate協議,並將自身設置為talbeview的delegate的對象,是被適配器,一般情況下該對象是UITableViewController。
  UITableVIew的Data Source方法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;


  11. 什麼是簡便構造方法?
  答案:簡便構造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
  Foundation下大部分類均有簡便構造方法,我們可以通過簡便構造方法,獲得系統給我們創建好的對象,並且不需要手動釋放。


  12. 什麼是謂詞?
  答案:謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數據的篩選。
  predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
  a = [customers filteredArrayUsingPredicate:predicate];


  13. 談談對Block 的理解?並寫出一個使用Block執行UIVew動畫?
  答案:Block是可以獲取其他函數局部變量的匿名函數,其不但方便開發,並且可以大幅提高應用的執行效率(多核心CPU可直接處理Block指令)
  [UIView transitionWithView:self.view
  duration:0.2
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{ [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0]; }
  completion:NULL];


  14. 多線程是什麼
  多線程是個復雜的概念,按字面意思是同步完成多項任務,提高了資源的使用效率,從硬件、操作系統、應用軟件不同的角度去看,多線程被賦予不同的內涵,對於硬件,現在市面上多數的CPU都是多核的,多核的CPU運算多線程更為出色;從操作系統角度,是多任務,現在用的主流操作系統都是多任務的,可以一邊聽歌、一邊寫博客;對於應用來說,多線程可以讓應用有更快的回應,可以在網絡下載時,同時響應用戶的觸摸操作。在iOS應用中,對多線程最初的理解,就是並發,它的含義是原來先做燒水,再摘菜,再炒菜的工作,會變成燒水的同時去摘菜,最後去炒菜。


  15. iOS 中的多線程
  iOS中的多線程,是Cocoa框架下的多線程,通過Cocoa的封裝,可以讓我們更為方便的使用線程,做過C++的同學可能會對線程有更多的理解,比如線程的創立,信號量、共享變量有認識,Cocoa框架下會方便很多,它對線程做了封裝,有些封裝,可以讓我們創建的對象,本身便擁有線程,也就是線程的對象化抽象,從而減少我們的工程,提供程序的健壯性。
  GCD是(Grand Central Dispatch)的縮寫 ,從系統級別提供的一個易用地多線程類庫,具有運行時的特點,能充分利用多核心硬件。GCD的API接口為C語言的函數,函數參數中多數有Block,關於Block的使用參看這裡,為我們提供強大的“接口”,對於GCD的使用參見本文
  NSOperation與Queue
  NSOperation是一個抽象類,它封裝了線程的細節實現,我們可以通過子類化該對象,加上NSQueue來同面向對象的思維,管理多線程程序。具體可參看這裡:一個基於NSOperation的多線程網絡訪問的項目。
  NSThread
  NSThread是一個控制線程執行的對象,它不如NSOperation抽象,通過它我們可以方便的得到一個線程,並控制它。但NSThread的線程之間的並發控制,是需要我們自己來控制的,可以通過NSCondition實現。
  參看 iOS多線程編程之NSThread的使用
  其他多線程
  在Cocoa的框架下,通知、Timer和異步函數等都有使用多線程,(待補充).


  16. 在項目什麼時候選擇使用GCD,什麼時候選擇NSOperation?
  項目中使用NSOperation的優點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具有面向對象的優點(復用、封裝),使得實現是多線程支持,而接口簡單,建議在復雜項目中使用。
  項目中使用GCD的優點是GCD本身非常簡單、易用,對於不復雜的多線程操作,會節省代碼量,而Block參數的使用,會是代碼更為易讀,建議在簡單項目中使用。


  17. 什麼是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。

 

  18. OC的垃圾回收機制?
  答案: OC2.0有Garbage collection,但是iOS平台不提供。
  一般我們了解的objective-c對於內存管理都是手動操作的,但是也有自動釋放池。
  但是差了大部分資料,貌似不要和arc機制搞混就好了。

 

19. block 實現原理
  Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。
  從計算語言的發展,最早的goto,高級語言的指針,到面向對象語言的block,從機器的思維,一步步接近人的思維,以方便開發人員更為高效、直接的描述出現實的邏輯(需求)。
  下面是兩篇很好的介紹block實現的博文
  iOS中block實現的探究
  談Objective-C Block的實現
  3 block的使用
  使用實例
  cocoaTouch框架下動畫效果的Block的調用
  使用typed聲明block
  typedef void(^didFinishBlock) (NSObject *ob);
  這就聲明了一個didFinishBlock類型的block,
  然後便可用
  @property (nonatomic,copy) didFinishBlock finishBlock;
  聲明一個blokc對象,注意對象屬性設置為copy,接到block 參數時,便會自動復制一份。
  __block是一種特殊類型,
  使用該關鍵字聲明的局部變量,可以被block所改變,並且其在原函數中的值會被改變。
  4 常見系列面試題
  面試時,面試官會先問一些,是否了解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();});
 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved