1. 程式人生 > >iOS面試題系列之UI相關

iOS面試題系列之UI相關

1、 簡述app啟動週期。

開啟應用程式,它先會執行main函式,再執行UIApplicationMain函式。初始化 UIApplication,設定代理物件,開啟事件迴圈,呼叫代理方法進行事件處理。

首先會呼叫application:didFinishLaunchingWithOptions:代理方法。

接下來會呼叫applicationDidBecomeActive:代理方法。監聽系統事件,結束程式。當程式正常退出UIApplicationMain函式才會返回。

監聽系統事件:

鎖屏後app會呼叫:applicationWillResignActive:代理方法。然後接著呼叫 applicationDidEnterBackground:方法。

解鎖後app會呼叫:applicationWillEnterForeground:代理方法。接著呼叫 applicationDidBecomeActive代理方法。

殺死程序會呼叫:applicationWillTerminate:代理方法。

接聽電話:先呼叫applicationWillResignActive:代理方法。結束通話電話後會直接進入 應用調:applicationDidBecomeActive:代理方法。

出現記憶體警告會呼叫:applicationDidReceiveMemoryWarning:代理方法

2、 簡單的說說UIApplication的作用及繼承關係。

(1)UIApplication是繼承UIResponder的。UIApplication是整個應用程式的核 心。每一個程式在執行期必須有UIApplication(或子類)的一個例項(有且只有一 個),通過[UIApplication shareApplication]可以得到這個單例例項。

(2)UIApplication幫助管理應用程式的生命週期,通過delegate來履行任務。

(3)UIApplication可以接收事件,把所有使用者事件都放入佇列,逐個處理。它會發送 當前事件給一個合適的目標控制元件進行處理。他還將部分事件轉給delegate物件來處理。 delegate可以處理的事件包括:應用程式的生命週期事件(如程式啟動與關閉)、系統事 件(如來電)。

3、 簡述推送訊息原理。

(1)應用程式註冊接收遠端通知的時候,系統會發送請求到APNS伺服器。APNS伺服器收 到請求後會根據請求所帶的key值生成一個獨一無二的deviceToken。然後APNS伺服器會把deviceToken包裝成NSData物件傳送到對應請求的App上。接下來APP把deviceToken傳送給我們自己的伺服器(Provider)。伺服器接收到deviceToken後進行儲存等相關處理。伺服器會把推送給使用者的訊息傳送至APNS伺服器,最後APNS伺服器再發送通知給app。

(2)有關於deviceToken變化問題:重新安裝或解除安裝應用程式,deviceToken不會發生變化。系統升級deviceToken可能會發生變化。抹掉所有內容和設定,重置裝置後,deviceToken會變化

(3)註冊遠端通知方法註冊遠端通知:一般在app啟動完成的時候註冊遠端通知,註冊方法一般在didFinishLaunchingWithOptions:代理方法中處理註冊遠端通知回撥方法:註冊成功會回撥didRegisterForRometoNotificationsWithDeviceToken:其中的deviceToken引數就是APNS伺服器返回的token。註冊失敗會回撥didFailToRegisterForRemoteNotificationsWithError:

(4)處理接收到的遠端通知訊息程式啟動時,app從Terminate狀態進入Foreground狀態時,會根據didFinishLaunchingWithOptions:代理方法中的luanchOptions引數來獲取userInfo。判斷是否有推送訊息。方式如下: // userInfo為收到遠端通知的內容NSDictionary*userInfo=launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];if (userInfo) { // 有推送的訊息,處理推送的訊息 }如果app處於Background狀態時,只有使用者點選了通知訊息才會呼叫didReceiveRemoteNotification:,如果當前app處於Foreground狀態,會直接呼叫該方法。

4、 簡單說下UITableView、UIButton、UIWindow控制元件的繼承關係。

(1)UITableView的繼承關係:UITableView繼承UIScrollView。UIScrollView繼承UIView。UIView繼承UIResponder。UIResponder繼承NSObject。

(2)UIButton的繼承關係:UIButton繼承UIControl,UIControl繼承UIView。UIView繼承UIResponder,UIResponder繼承NSObject。

(3)UIWindow繼承UIView。

5、 UIView與UIButton有什麼區別?UISwitch呢?

UIView繼承自UIResponder,它能響應某個動作。UIButton繼承UIControl。它不僅可以響應某個動作,還能為某個物件新增對應的動作加以響應。UIButton也能實現UISwitch的功能,它們的區別是分發的事件不一樣。

6、 簡述UIControl的繼承關係,它用來做什麼?

UIControl繼承UIView。UIView繼承UIResponder,UIResponder繼承NSObject。它能為某個特定物件新增事件。能進行事件分發。

7、 簡述UIViewController中view的生命週期。

先呼叫loadView方法,再呼叫viewDidLoad方法,呼叫viewWillAppear方法,呼叫viewWillLayoutSubviews方法,呼叫viewDidLayoutSubviews方法,再呼叫viewDidApper方法。控制器消失的時候先呼叫viewWillDisappear方法,再呼叫viewDidDisapper方法。最後呼叫dealloc方法。當出現記憶體警告的時候會呼叫didReceiveMemoryWarning方法。

8、 簡述UITableView的代理方法呼叫順序。

先呼叫numberOfSectionsInTableView:方法,

numberOfRowsInSection:

heightForRowAtIndexPath:

cellForRowAtIndexPath:

9、 你在用CollectionView的時候有沒有遇到什麼問題?問題是怎麼解決的?

重新整理的時候會閃爍。在重新整理的時候會預設附加一個隱式的fade動畫。可以通過取消動畫來達到取消閃爍的目的。

10、 簡述UIResponder類的作用。

UIResponder類主要是為那些需要響應並處理事件的物件定義了一組介面。這些事件包括:觸控事件、運動事件、遠端控制事件(如耳機控制音視訊播放)。當用戶觸發某一事件時,UIKit會建立一個UIEvent事件物件,事件物件會加入到一個FIFO先進先出的佇列中。UIApplication物件處理事件時,會從佇列頭部取出一個事件物件進行分發。

11、 如何監聽View的觸控事件?事件如何傳遞?簡述檢視的響應者鏈。

可以通過View類的touchesBegan、touchesMoved、touchesEnded、touchesCancelled方法監聽檢視的觸控。 當觸控一個檢視物件時,系統會捕捉此事件,並給這個事件建立一個UIEvent物件,將此物件加入當前應用程式的事件佇列中,然後由UIApplication物件從佇列中取出來進行事件分發,首先會分發給UIWindow物件,然後由UIWindow物件分發給觸控的檢視物件,即第一響應者物件。

響應者鏈:當事件交給第一響應者處理,如果第一響應者不處理,事件就會沿著響應者鏈向上傳遞,交給下一個響應者。一般來說,第一響應者是一個檢視物件或者是其子類物件,當其被觸控後事件被交由它處理,如果它不處理,事件就會被傳遞給它的檢視控制器物件,然後是它的父檢視物件,以此類推,直到頂層檢視。接下來會沿著頂層檢視到UIWindow物件,再到UIApplication物件。如果整個過程都沒有響應這個事件,該事件就會被丟棄,一般情況下,在響應者鏈中只要有物件處理事件,事件就會停止傳遞。有時候可以在檢視的響應方法中根據一些條件判斷來決定是否需要繼續傳遞事件。

12、 CALayer與UIView有什麼區別?

(1)UIView是iOS系統中介面元素的繼承。所有的介面元素都繼承自它,他本身完全是由CoreAnimation來實現的。它真正的繪圖部分,是由一個叫CALayer的類來管理。UIView本身更像是一個CALayer的管理器,訪問它的跟繪圖和跟座標有關的屬性,如frame,bounds等,實際上內部都是在訪問它所包含的CALayer的相關屬性。

(2)UIView有個layer屬性,可以返回它的主CALayer例項,UIView有一個layerClass方法,返回主layer所使用的類,UIView的子類,可以通過過載這個方法,來讓UIView使用不同的CALayer來顯示。

(3)UIView的CALayer類似UIView的子View樹形結構,也可以向它的layer上新增子layer。

(4)CALayer座標系統與UIView有點不一樣,它多了一個anchorPoint的屬性。

(5)UIView的layer樹形在系統內部,被系統維護著三份copy。邏輯樹,動畫樹,顯示樹。

(6)CALayer預設修改屬性支援隱式動畫

(7)View可以接受並處理事件,Layer不可以。

13、 如何優化UITableView?

(1)複用單元格

(2)使用不透明的檢視,單元格中少使用動畫。

(3)圖片使用非同步載入,設定圖片載入的併發數。

(4)滑動時不載入圖片,停止滑動時再載入。

(5)圖片和文字可以直接drawRect

(6)如果cell是動態行高,計算快取單元格高度

(7)儘量少reloadData,只reloadRowsAtIndexPaths

(8)cell高度固定直接用rowHeight屬性設定高度。

14、 簡述載入到控制器上的根檢視建立與載入時機。

檢視控制器的根檢視載入是在UIViewController的loadView方法中。當檢視控制中的loadView方法被呼叫時,會先通過NSBundle載入,通過控制器的類名作為xib檔名載入xib檔案,如果存在,載入View為根檢視,如果不存在,則自動建立一個View作為根檢視。

15、 簡述UITableView中cell的複用機制。

UITableView會建立螢幕顯示單元格個數(N)+1個單元格,當滑動到第N+2個單元格時就會複用第1個單元格。UITableView中還有單元格複用池的概念。當tableView呼叫初始化單元格協議方法獲取單元格時,它會根據你設定的reuse identifier先去複用池中查詢可用的複用單元格,找到則複用該單元格,沒找到這建立一個新的單元格物件。

轉載自楊社兵的技術部落格:http://yangshebing.github.io/blog/2016/04/24/iosmian-shi-ti-xi-lie-zhi-uiji-chu/