iOS經典面試題
前言 寫這篇文章的目的是因為前兩天同學想應聘iOS開發,從網上找了iOS面試題和答案讓我幫忙看看。我掃了一眼,倒吸了一口冷氣,仔細一看,氣的發抖。整篇題目30多個沒有一個答案是對的,總結這篇面試題的作者對iOS機制根本就是一知半解就敢發到網上,不管有心還是無心都是坑害新人。所以在這裡總結一下這幾年面試別人和被別人面試遇到的一些我認為比較好的基礎題目分享給大家,進階題目在後續補充。我的理解如果有錯漏請一定指出,非常感謝!
從12年開始做面試官到現在已經三個年頭了,這期面過很多形形色色的開發,有騰訊的、有百度的、有小公司的、有做外包的,還有完全沒有程式碼能力來做管理的。給我的感覺是百度出品的技術能力最好,基礎知識、技術細節掌握的非常的紮實並且自信。騰訊出品技術細節上也非常厲害,平均來說比百度差一些,但是解決問題的能力非常強,思維很活躍大局觀好。小公司、外包公司的同學技術細節、基礎知識要差一些。我個人是非常反對以出身論英雄BAT出品就一定比其他公司的優秀,只能說BAT提供的技術氛圍更好,你可以跟更多優秀的人共事,相比小公司技術進步更容易些。
這期間我也面了很多網際網路公司,騰訊、百度、阿里、快播還有其他很多中小型公司,給我的感覺是中國整體的網際網路面試官的態度非常糟糕,面試官經常性習慣性的遲到,理由有開會啦、在吃飯啦,最離譜的是沒有任何理由就讓你在那裡等。其實我覺得現在這些公司啊還沒有認清楚一個現狀,就是絕大多數幹開發的都只是來看看機會,不是來求職的,所以總是找不到人。一邊說自己的公司多麼求賢若渴,應聘者來了又不給予應有的尊重。我認為面試是非常不好的一個詞,應聘過程應該叫面談、review更合適,它是一個雙向選擇的過程。
我參加的面試不下五十次,只有兩次面試官遞給我一杯水,一次是騰訊的技術一面,後來那個面試官也是我最尊敬的組長,還有一次是快播的hr面。其他面試官直接無視汗流浹背頂著深圳烈日趕來面試的我,基本上每次面試完都是半脫水狀態。面試更主要的是考察一個應聘者在正常環境下的工作能力而不是極端環境下的應激能力,面試官不是要把應聘者問倒、提一些刁鑽的問題把他難住而是應該幫助應應聘者緩解他的緊張和壓力,並適當的提示,讓應聘者最大限度的發揮,這才是一個合格面試官最基本的素質。
iOS面試知識點 現在進入本篇的正題。本篇的面試題是我認為比較好的iOS開發基礎知識點,希望大家看過這後在理解的基礎上掌握而不是死記硬背。死記硬背很快也會忘記的。
1 iOS基礎 1.1 父類實現深拷貝時,子類如何實現深度拷貝。父類沒有實現深拷貝時,子類如何實現深度拷貝。 深拷貝同淺拷貝的區別:淺拷貝是指標拷貝,對一個物件進行淺拷貝,相當於對指向物件的指標進行復制,產生一個新的指向這個物件的指標,那麼就是有兩個指標指向同一個物件,這個物件銷燬後兩個指標都應該置空。深拷貝是對一個物件進行拷貝,相當於對物件進行復制,產生一個新的物件,那麼就有兩個指標分別指向兩個物件。當一個物件改變或者被銷燬後拷貝出來的新的物件不受影響。
實現深拷貝需要實現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 如何重寫類方法 1、在子類中實現一個同基類名字一樣的靜態方法 2、在呼叫的時候不要使用類名呼叫,而是使用[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
喜歡的話可以點個贊:+1:或關注。
小編給大家推薦一個iOS技術交流群:458839238!群內提供資料結構與演算法、底層進階、swift、逆向、整合面試題等免費資料
另外附上一份收集的各大廠面試題(附答案) ! 群檔案直接獲取
各大廠面試題
文章來源網路 如有侵權請聯絡小編刪除