iOS經典面試題

前言

寫這篇文章的目的是由於前兩天同窗想應聘iOS開發,從網上找了iOS面試題和答案讓我幫忙看看。我掃了一眼,倒吸了一口冷氣,仔細一看,氣的發抖。整篇題目30多個沒有一個答案是對的,總結這篇面試題的做者對iOS機制根本就是隻知其一;不知其二就敢發到網上,無論有心仍是無意都是坑害新人。因此在這裏總結一下這幾年面試別人和被別人面試遇到的一些我認爲比較好的基礎題目分享給你們,進階題目在後續補充。個人理解若是有錯漏請必定指出,很是感謝!html

從12年開始作面試官到如今已經三個年頭了,這期面過不少形形色色的開發,有騰訊的、有百度的、有小公司的、有作外包的,還有徹底沒有代碼能力來作管理的。給個人感受是百度出品的技術能力最好,基礎知識、技術細節掌握的很是的紮實而且自信。騰訊出品技術細節上也很是厲害,平均來講比百度差一些,可是解決問題的能力很是強,思惟很活躍大局觀好。小公司、外包公司的同窗技術細節、基礎知識要差一些。我我的是很是反對以出身論英雄BAT出品就必定比其餘公司的優秀,只能說BAT提供的技術氛圍更好,你能夠跟更多優秀的人共事,相比小公司技術進步更容易些。ios

這期間我也面了不少互聯網公司,騰訊、百度、阿里、快播還有其餘不少中小型公司,給個人感受是中國總體的互聯網面試官的態度很是糟糕,面試官常常性習慣性的遲到,理由有開會啦、在吃飯啦,最離譜的是沒有任何理由就讓你在那裏等。其實我以爲如今這些公司啊尚未認清楚一個現狀,就是絕大多數幹開發的都只是來看看機會,不是來求職的,因此老是找不到人。一邊說本身的公司多麼求賢若渴,應聘者來了又不給予應有的尊重。我認爲面試是很是很差的一個詞,應聘過程應該叫面談、review更合適,它是一個雙向選擇的過程。面試

我參加的面試不下五十次,只有兩次面試官遞給我一杯水,一次是騰訊的技術一面,後來那個面試官也是我最尊敬的組長,還有一次是快播的hr面。其餘面試官直接無視汗流浹背頂着深圳烈日趕來面試的我,基本上每次面試完都是半脫水狀態。面試更主要的是考察一個應聘者在正常環境下的工做能力而不是極端環境下的應激能力,面試官不是要把應聘者問倒、提一些刁鑽的問題把他難住而是應該幫助應應聘者緩解他的緊張和壓力,並適當的提示,讓應聘者最大限度的發揮,這纔是一個合格面試官最基本的素質。算法

iOS面試知識點

如今進入本篇的正題。本篇的面試題是我認爲比較好的iOS開發基礎知識點,但願你們看過這後在理解的基礎上掌握而不是死記硬背。死記硬背很快也會忘記的。編程

1 iOS基礎

1.1 父類實現深拷貝時,子類如何實現深度拷貝。父類沒有實現深拷貝時,子類如何實現深度拷貝。

  • 深拷貝同淺拷貝的區別:淺拷貝是指針拷貝,對一個對象進行淺拷貝,至關於對指向對象的指針進行復制,產生一個新的指向這個對象的指針,那麼就是有兩個指針指向同一個對象,這個對象銷燬後兩個指針都應該置空。深拷貝是對一個對象進行拷貝,至關於對對象進行復制,產生一個新的對象,那麼就有兩個指針分別指向兩個對象。當一個對象改變或者被銷燬後拷貝出來的新的對象不受影響。swift

  • 實現深拷貝須要實現NSCoying協議,實現- (id)copyWithZone:(NSZone *)zone 方法。當對一個property屬性含有copy修飾符的時候,在進行賦值操做的時候實際上就是調用這個方法。設計模式

  • 父類實現深拷貝以後,子類只要重寫copyWithZone方法,在方法內部調用父類的copyWithZone方法,以後實現本身的屬性的處理安全

  • 父類沒有實現深拷貝,子類除了須要對本身的屬性進行處理,還要對父類的屬性進行處理。網絡

1.2 KVO,NSNotification,delegate及block區別

  • KVO就是cocoa框架實現的觀察者模式,通常同KVC搭配使用,經過KVO能夠監測一個值的變化,好比View的高度變化。是一對多的關係,一個值的變化會通知全部的觀察者。
  • NSNotification是通知,也是一對多的使用場景。在某些狀況下,KVO和NSNotification是同樣的,都是狀態變化以後告知對方。NSNotification的特色,就是須要被觀察者先主動發出通知,而後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,可是其優勢是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。數據結構

  • delegate 是代理,就是我不想作的事情交給別人作。好比狗須要吃飯,就經過delegate通知主人,主人就會給他作飯、盛飯、倒水,這些操做,這些狗都不須要關心,只須要調用delegate(代理人)就能夠了,由其餘類完成所須要的操做。因此delegate是一對一關係。

  • block是delegate的另外一種形式,是函數式編程的一種形式。使用場景跟delegate同樣,相比delegate更靈活,並且代理的實現更直觀。

  • KVO通常的使用場景是數據,需求是數據變化,好比股票價格變化,咱們通常使用KVO(觀察者模式)。delegate通常的使用場景是行爲,需求是須要別人幫我作一件事情,好比買賣股票,咱們通常使用delegate。
    Notification通常是進行全局通知,好比利好消息一出,通知你們去買入。delegate是強關聯,就是委託和代理雙方互相知道,你委託別人買股票你就須要知道經紀人,經紀人也不要知道本身的顧客。Notification是弱關聯,利好消息發出,你不須要知道是誰發的也能夠作出相應的反應,同理發消息的人也不須要知道接收的人也能夠正常發出消息。

1.3 KVC若是實現,如何進行鍵值查找。KVO如何實現

請看這兩篇博文 KVC KVO

1.4 將一個函數在主線程執行的4種方法

  • GCD方法,經過向主線程隊列發送一個block塊,使block裏的方法能夠在主線程中執行。
dispatch_async(dispatch_get_main_queue(), ^{      
    //須要執行的方法
});
  • NSOperation 方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  //主隊列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    //須要執行的方法
}];
[mainQueue addOperation:operation];
  • NSThread 方法
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];

[[NSThread mainThread] performSelector:@selector(method) withObject:nil];
  • RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];

1.5 如何讓計時器調用一個類方法

  • 計時器只能調用實例方法,可是能夠在這個實例方法裏面調用靜態方法。
  • 使用計時器須要注意,計時器必定要加入RunLoop中,而且選好model才能運行。scheduledTimerWithTimeInterval方法建立一個計時器並加入到RunLoop中因此能夠直接使用。
  • 若是計時器的repeats選擇YES說明這個計時器會重複執行,必定要在合適的時機調用計時器的invalid。不能在dealloc中調用,由於一旦設置爲repeats 爲yes,計時器會強持有self,致使dealloc永遠不會被調用,這個類就永遠沒法被釋放。好比能夠在viewDidDisappear中調用,這樣當類須要被回收的時候就能夠正常進入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];

-(void)timerMethod
{
//調用類方法
    [[self class] staticMethod];
}

-(void)invalid
{
    [timer invalid];
    timer = nil;
}

1.6 如何重寫類方法

  • 一、在子類中實現一個同基類名字同樣的靜態方法
  • 二、在調用的時候不要使用類名調用,而是使用[self class]的方式調用。原理,用類名調用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運行時決定調用哪一個方法。

1.7 NSTimer建立後,會在哪一個線程運行。

  • 用scheduledTimerWithTimeInterval建立的,在哪一個線程建立就會被加入哪一個線程的RunLoop中就運行在哪一個線程
  • 本身建立的Timer,加入到哪一個線程的RunLoop中就運行在哪一個線程。

1.8 id和NSObject*的區別

  • id是一個 objc_object 結構體指針,定義是
typedef struct objc_object *id
  • id能夠理解爲指向對象的指針。全部oc的對象 id均可以指向,編譯器不會作類型檢查,id調用任何存在的方法都不會在編譯階段報錯,固然若是這個id指向的對象沒有這個方法,該崩潰仍是會崩潰的。

  • NSObject *指向的必須是NSObject的子類,調用的也只能是NSObjec裏面的方法不然就要作強制類型轉換。

  • 不是全部的OC對象都是NSObject的子類,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。

個人理解若是有錯漏請必定指出,很是感謝!

如下內容後續補充

iOS 核心框架

  • CoreAnimation
  • CoreGraphics
  • CoreLocation
  • AVFoundation
  • Foundation

iOS核心機制

  • UITableView 重用
  • ObjC內存管理;自動釋放池,ARC如何實現
  • runloop
  • runtime
  • Block的定義、特性、內存區域、如何實現
  • Responder Chain
  • NSOperation
  • GCD

數據結構

  • 8大排序算法
  • 二叉樹實現
  • 二分查找實現

面向對象編程

  • 封裝、繼承、多態

  • 設計模式6個原則

  • 設計一個類的功能,如何劃分粒度(單一職責)

  • 接口隔離。

  • 若是有一個鳥類,有飛的動做,一個鴕鳥繼承它是合適的嗎(里氏替換)

  • 類之間的依賴如何依賴偶合度最小(依賴倒轉)
    高層依賴低層,低層不能依賴高層。依賴接口,不能依賴具體的類。

  • 若是A要調用C函數,但C是B的成員類,應該如何設計?(迪米特)

  • 如何設計類,能作到只增長代碼,而不修改代碼,有哪些經驗(開放封閉)
    經過設計模式解決。

計算機技術

  • 計算機網絡: TCP/IP、HTTPCDN、SPDY
  • 計算機安全: RSA、AES、DES
  • 操做系統:線程、進程、堆棧、死鎖、調度算法

iOS新特性、新技術

  • iOS7 UIDynamic、SpritKit、新佈局、扁平化
  • iOS8 應用程序擴展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
  • iOS9
  • Apple Watch
  • 第三方庫:SDWebImage、AFNetwork、JSONKit、wax
  • swift
相關文章
相關標籤/搜索