天天看點

iOS崗位面試一及小結

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

上周去一家公司應聘iOS崗位,在此将部分面試題目加以分析,解答僅供參考,歡迎大家糾正,同時在此也對該公司給予面試機會表示感謝。

1,請簡述什麼是懶加載,懶加載的優點,如果在頁面中有一個@property(nonatomic, retain) UILabel *label;屬性,請寫出懶加載方法(寫出核心get方法)。

解答:懶加載——也稱為延遲加載,即在需要的時候才加載(加載效率低,占用記憶體小),通俗的說就是在程式啟動的時候不加載資源,隻有在運作當需要一些資源時再去加載這些資源。其實就是重寫對象的get方法,當系統或者開發者調用對象的get方法時,再去加載對象。如果是懶加載的話則一定要注意先判斷是否已經有了,如果沒有那麼再去進行執行個體化。
使用懶加載的好處:a,不必将建立對象的代碼全部寫在viewDidLoad方法中,增加代碼可讀性。b,每個控件的getter方法中分别負責各自的執行個體化處理,代碼間獨立性強,松耦合。c,隻有當真正需要資源時,再去加載,節省了記憶體資源。
- (UILabel *)label {
    // 判斷是否已經有了,若沒有,則進行執行個體化
    if(!_label) {
        _label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
        [_label setTextAlignment:NSTextAlignmentCenter];
        // ...其它屬性值設定
        [self.view addSubview: _label];
    }
    return _label;
}
           

2,請較長的描述你對MVC設計模式的了解。

解答:MVC全名是Model View Controller,是模型(Model)-視圖(View)-控制器(Controller)的縮寫,是一種常見的設計模式,該模式不僅定義了對象在應用程式中扮演的角色,而且還定義了對象間互相通信的方式,三種類型對象彼此之間通過抽象邊界進行分離并且通過這些邊界與其它類型對象進行通信。
M:Model(模型)表示應用程式資料模型,管理應用程式資料,封裝應用程式特定資料,并定義操控和處理該資料的邏輯和運算。
V:View(視圖)應用程式顯示資料的部分,是使用者看到并與之互動的對象,視圖對象知道如何繪制自己,并能夠對使用者的操作做出響應,主要目的就是呈現應用程式中的模型對象資料并且使其資料可編輯。
C:Controller(控制器)應用程式中處理使用者互動的部分,負責M與V的互動,它通路模型中的資料并在視圖中展示它們,同時它們還監聽事件和根據需要操作資料。模型會把任何資料的變更通知控制器,然後控制器更新視圖資料。視圖對象通知控制器使用者的操作,控制器響應使用者的操作根據需要更新模型或者檢索被請求的資料。

3,請簡述iOS應用程式從前台切換到背景,應用程式的狀态改變情況。

解答:首先對應用程式的運作狀态做個簡單介紹。在任何時刻,應用程式都是下述狀态之一,系統通過對一些事件的響應而切換狀态。
Not running 未運作 應用程式未啟動或運作但已經被系統終止
Inactive 未激活 應用程式在前台運作,但目前并沒有接收到事件。(也有可能正在執行其它代碼。)當應用要從一個狀态切換到另外一個不同狀态時,中途過度會短暫停留在此狀态
Active 激活 應用程式在前台運作而且接收到了事件。這是應用在前台運作時所處的正常狀态。
Background 背景 應用程式在背景執行代碼。大多數應用在Suspended之前都會先短暫進入該狀态。但是,如果應用請求更多額外的執行時間,該應用會在該狀态保持更長一段時間。此外,如果一個應用要求啟動時直接進入背景運作,這樣的應用會直接從Not Running狀态進入Background狀态,中間不會經過Inactive狀态
Suspended 挂起 應用程式處在背景但是沒有執行任何代碼。系統會自動将應用轉入該狀态,并且在轉入之前不會發出任何通知。當處于該狀态時,應用依然駐留記憶體但不執行任何代碼。當系統發生低記憶體警告時,系統不會發出任何通知而将處于Suspended狀态的應用徹底移除記憶體進而為前台應用釋放更多的記憶體。
當使用者按下Home鍵或者系統啟動另外一個應用時,前台應用首先會切換到Inactive狀态,然後切換到Background狀态。系統将會自動調用應用委托的applicationWillResignActive:和applicationDidEnterBackground:方法。當applicationDidEnterBackground:方法執行完成後,大部分應用将會在不久後轉入Suspended狀态。對于請求特定背景任務的應用(如播放音樂)或者那些請求需要額外執行時間的應用,可能會繼續執行更長一段時間。是以,我們通常會在applicationDidEnterBackground:方法中儲存使用者資料或狀态資訊,盡可能的釋放記憶體,該方法大概有5秒時間,如果逾時還未完成任務,程式就會被終止而且從記憶體中清除。若需要長時間的運作任務,可調用beginBackgroundTaskWithExpirationHandler方法去請求背景運作時間,然後啟動一個能長期執行任務的線程。無論是否成功啟動執行背景任務的線程,applicationDidEnterBackground:方法都會在5秒内退出。

4,本地通知和遠端推送通知的差別。

解答:本地通知(Local Notification)是不需要聯網就可以發出的通知,是由本地應用觸發的,基于時間行為的一種通知形式。經常用于提醒使用者完成一些任務,比如:鬧鐘定時提醒,生活備注,看電影,待辦事項提醒等等。建立一個本地通知步驟為:a,建立UILocalNotification。b,設定處理通知時間fireDate。c,配置通知的内容,包括主體,聲音,徽章數字等。d,配置通知傳遞的自定義資料參數userInfo。e,調用通知,可以使用scheduleLocalNotification: 依照fireDate排程一個通知,也可以使用presentLocalNotificationNow:忽略fireDate而立即調用通知。
遠端推送通知(Remote Notification)是從遠端伺服器(APNs)推送給用戶端的通知,需要聯網,是由應用伺服器提供商發起的,注意APNs和應用伺服器不是同一個。經常用于聊天功能(一般非即時聊天),推送App内部新功能等。使用遠端推送通知步驟為:a,UIApplication向APNs注冊push notification服務。b,擷取APNs配置設定的Device Token。c,把Device Token發送給自己的背景伺服器。d,伺服器推送消息給用戶端(實質是伺服器發送消息給APNs,APNs自動将消息推送給用戶端。伺服器每次推送消息不僅需要用戶端的Device Token還需要push證書,對push的内容進行簽名)。e,用戶端處理收到的通知資訊。
注意:在iOS8以後使用兩種通知之前都必須先注冊通知類型,注冊之後首次打開app會彈出提示框詢問是否允許接收通知,後續不會再彈出該提示框,但可以在設定中更改該值。

5,請簡述沙盒中三個常用檔案夾(Documents,Library,tmp)的使用場景。

解答:Documents,一般用來存放應用程式建立的檔案,如資料庫檔案,或在程式中浏覽到的檔案資料,iTunes備份和恢複的時候會包含該目錄。
Library,存儲程式的預設設定及其它狀态資訊,基于NSUserDefaults的首選項參數儲存在Library/Preferences下,緩存檔案儲存在Library/Caches下,iTunes備份和恢複時會包含該目錄,但不包含Caches子目錄。NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *path = [path firstObject];可擷取對應目錄路徑。上述NSSearchPathForDirectoriesInDomains方法中的第一個參數表面我們要搜尋的目錄名稱,這裡搜尋的是Documents目錄,将其換成NSLibraryDirectory就表示搜尋的是Library目錄。第二個參數指定搜尋範圍。第三個表示是否展開波浪線~。
tmp,存放臨時檔案,app重新開機時該目錄下的檔案清空,iTunes備份和恢複時不包含該目錄。NSTemporaryDirectory()可擷取該目錄路徑。

6,請簡述你對深拷貝與淺拷貝的了解。

解答:淺拷貝,不拷貝對象本身而僅僅是拷貝指向對象的指針,即淺拷貝隻是增加了一個指針指向已經存在的記憶體,對象的引用計數器加1,其實相當于做了一次retain操作,改變其中一個會影響到另一個。
深拷貝,直接拷貝整個對象記憶體到另一塊記憶體中,不僅拷貝指向對象的指針而且還拷貝指針指向的内容,即增加一個指針并且申請一個新的記憶體,使這個增加的指針指向這個新的記憶體,源對象引用計數器不變,副本計數器設定為1,改變其中一個不會影響到另一個。