2018 年 3月 iOS 面試總結

雖然前面已經(jīng)分享過比較多的面試題,但是最近很多人給我反應還在找工作。

我想還是再總結一下關于面試的一些資料吧。

一.筆試題

筆試基本都有一兩道基礎題,比如說UITableView的重用機制,ARC的基本原理,如何避免retain cycle,談談對MVC的理解,iOS內存管理機制、WebView與JS交互、安全機制。這些大家應該都很清楚了。筆試的內容有幾種有選擇題,問答題,難一點的就是多選題了。我朋友面試了一家就是給了10道多選題,多選,少選,錯選都不行,他說當時做完以后就感覺不是很好,有些題目題干就是一下哪些是對的,然后ABCD依次給4個不同的概念,這種一道題相當于考了4個點??傊龅竭@種“惡心”的多選題也不要太慌,靜下心來一一甄別應該能拿到不錯的成績。

下面這份面試清單請收下


圖一



圖二


圖三


圖四

上面的面試清單完全是小插曲

接下來說幾個答的不怎么好的題目,朋友當時記了一下,和大家分享一下。

1.進程和線程的區(qū)別和聯(lián)系

朋友說,這個其實是操作系統(tǒng)的問題,當時一下子把他問的懵了,后來仔細回想了一下,加上自己的理解就答了,下面說說稍微完整的答案,大家可以準備準備,再問這種問題就可以完美作答了。

進程是具有一定獨立功能的程序關于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調度的一個獨立單位.。線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行。

2.并行和并發(fā)的區(qū)別

并行是指兩個或者多個事件在同一時刻發(fā)生;

并發(fā)是指兩個或多個事件在同一時間間隔內發(fā)生。

3.談談你對Block和delegate的理解

他當時是這么答的,delegate的回調更多的面向過程,而block則是面向結果的。如果你需要得到一條多步進程的通知,你應該使用delegation。而當你只是希望得到你請求的信息(或者獲取信息時的錯誤提示),你應該使用block。(如果你結合之前的3個結論,你會發(fā)現(xiàn)delegate可以在所有事件中維持state,而多個獨立的block卻不能)

4.談談instancetype和id的異同

1、相同點

都可以作為方法的返回類型

2、不同點

①instancetype可以返回和方法所在類相同類型的對象,id只能返回未知類型的對象;②instancetype只能作為返回值,不能像id那樣作為參數(shù)

5.category中能不能使用聲明屬性?為什么?如果能,怎么實現(xiàn)?

這種問題一問,我當時就感覺肯定能實現(xiàn)的,但是實在不知道怎么做,后來回來查了一下,才知道是用到了Runtime的知識了。貼一下答案

給分類(Category)添加屬性

利用Runtime實現(xiàn)getter/setter 方法

@interface ClassName (CategoryName)@property (nonatomic, strong) NSString *str;@end//實現(xiàn)文件#import "ClassName + CategoryName.h"#importstatic void *strKey = &strKey;

@implementation ClassName (CategoryName)

-(void)setStr:(NSString *)str

{

? ? objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);

}

-(NSString *)str

{

? ? return objc_getAssociatedObject(self, &strKey);

}

@end

6.isKindOfClass和isMemberOfClass的區(qū)別

這個題目簡單,但是就是當時緊張的情況下,別答反了。

isKindOfClass來確定一個對象是否是一個類的成員,或者是派生自該類的成員

isMemberOfClass只能確定一個對象是否是當前類的成員

7.block里面的如何防止retain cycle

使用弱引用打斷block里面的retain cycle

MRC中?_block?是不會引起retain;但在ARC中?_block?則會引起retain。ARC中應該使用?_weak或__unsafe_unretained弱引用

8.iOS多線程有哪幾種實現(xiàn)方法?GCD中有哪些隊列?分別是并行還是串行?

iOS中多線程編程工具主要3有:

1.NSThread

2.NSOperation

3.GCD

dispatch queue分為下面3種:而系統(tǒng)默認就有一串行隊列main_queue和并行隊列global_queue:

GCD中有三種隊列類型:

The main queue:與主線程功能相同。實際上,提交至main queue的任務會在主線程中執(zhí)行。main queue可以調用dispatch_get_main_queue()來獲得。因為main queue是與主線程相關的,所以這是一個串行隊列。

Global queues:全局隊列是并發(fā)隊列,并由整個進程共享。進程中存在三個全局隊列:高、中(默認)、低三個優(yōu)先級隊列??梢哉{用dispatch_get_global_queue函數(shù)傳入優(yōu)先級來訪問隊列。

用戶隊列:用戶隊列 (GCD并不這樣稱呼這種隊列, 但是沒有一個特定的名字來形容這種隊列,所以我們稱其為用戶隊列) 是用函數(shù) dispatch_queue_create

創(chuàng)建的隊列,這些隊列是串行的。正因為如此,它們可以用來完成同步機制, 有點像傳統(tǒng)線程中的mutex。

9.談談NSString的時候用copy和strong的區(qū)別?

這個題目當時問出來,真的是一下子就傻了,平時雖然用的多,但是真的沒有注意比較過他們倆,看來平時學習還是多要問問所以然!

10.Core Data是數(shù)據(jù)庫么?有哪些重要的類?

感覺應該不是常理的,當時仔細想了想,Core Data確實不是一個數(shù)據(jù)庫,只是把表和OC對象進行的映射,當時并不是進進映射那么簡單,底層還是用的Sqlite3進行存儲的,所以Core Data不是數(shù)據(jù)庫。

有以下6個重要的類:

(1)NSManagedObjectContext(被管理的數(shù)據(jù)上下文)

操作實際內容(操作持久層)

作用:插入數(shù)據(jù),查詢數(shù)據(jù),刪除數(shù)據(jù)

(2)NSManagedObjectModel(被管理的數(shù)據(jù)模型)

數(shù)據(jù)庫所有表格或數(shù)據(jù)結構,包含各實體的定義信息

作用:添加實體的屬性,建立屬性之間的關系

操作方法:視圖編輯器,或代碼

(3)NSPersistentStoreCoordinator(持久化存儲助理)

相當于數(shù)據(jù)庫的連接器

作用:設置數(shù)據(jù)存儲的名字,位置,存儲方式,和存儲時機

(4)NSManagedObject(被管理的數(shù)據(jù)記錄)

相當于數(shù)據(jù)庫中的表格記錄

(5)NSFetchRequest(獲取數(shù)據(jù)的請求)

相當于查詢語句

(6)NSEntityDescription(實體結構)

相當于表格結構

以上是我朋友3月份面試遇到的問到的一下子沒有答全或者沒答好的問題,大神全部都會的話請忽略哈。然后還有2個開放性的問題,那基本就是完全考驗實力和自己理解的深度了。一個是談談你對Runtime的理解,另一個是談談你對Runloop的理解,由于我個人這兩個理解都不是很深,這里就不貼我的理解了。大家如果也感覺欠缺的,就趕緊去網(wǎng)上多看看吧!

10,sprintf,strcpy,memcpy使用上有什么要注意的地方

二.機試

這個環(huán)節(jié)基本都是大公司,或者是復試的時候會出現(xiàn),因為上機打代碼確實很很快區(qū)分出誰好誰壞,他面了一家這樣的公司,就給一張白紙,全程都是手寫代碼,這就完全是考驗基本功了,因為沒了代碼補全,沒有了編譯器告訴你哪里錯了,一切都要靠自己的基本功來了。

機試基本就是靠靠算法題了。當然也有算法題在筆試的最后幾道題出現(xiàn),那就看公司面試怎么安排的。

2年前我也是面試iOS,當時對算法和 數(shù)據(jù)結構要求很低的,很多面試基本都不問這些,今年面試多了這些問題,也讓我眼前一亮,也感嘆,2年技術發(fā)展之快,面試如今都會涉及到算法,不會算法和數(shù)據(jù)結構的程序員的道路會越走越窄。

算法題,畢竟不是BAT那種公司,簡單的就是直接要你寫一個算法出來,稍微高級點的就是有一個背景,然后要你解決問題,其實就是和ACM題目一樣的,不過就是沒有那么復雜。我貼幾段問的最多的算法,太難的題只能考自己的算法功底了。

二分查找 θ(logn)

遞歸方法

int binarySearch1(int a[] , int low , int high , int findNum)

{? ?

? ? ? int mid = ( low + high ) / 2;? ? ?

? ? ? if (low > high)? ? ? ?

? ? ? ? ? ? return -1;?

? ?? else?

? ?? {? ? ? ?

? ? ? ? ? ? ? if (a[mid] > findNum)? ? ? ? ?

? ? ? ? ? ? ? ? ? ? return binarySearch1(a, low, mid - 1, findNum);? ? ? ?

? ? ? ? ? ? ? else if (a[mid] < findNum)? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? return binarySearch1(a, mid + 1, high, findNum);? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? else? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? return mid;?

? ? }

}

非遞歸方法

int binarySearch2(int a[] , int low , int high , int findNum)

{? ?

? ? ?? while (low <= high)

? ? ? {

? ? ? ? ? ? int mid = ( low + high) / 2;?? //此處一定要放在while里面

? ? ? ? ? ? if (a[mid] < findNum)? ? ? ? ?

? ? ? ? ? ? ? ? low = mid + 1;? ? ? ?

? ? ? ? ? ? else if (a[mid] > findNum)? ? ? ? ? ?

? ? ? ? ? ? ? ? high = mid - 1;? ? ?

? ? ? ? ? ?? else? ? ? ? ?

? ? ? ? ? ? ? ? return mid;? ?

? ? }? ? ?

? ? return? -1;

}

冒泡排序?? θ(n^2)

void bubble_sort(int a[], int n)

{

? ? int i, j, temp;

? ? for (j = 0; j < n - 1; j++)

? ? ? ? for (i = 0; i < n - 1 - j; i++) //外層循環(huán)每循環(huán)一次就能確定出一個泡泡(最大或者最?。?,所以內層循環(huán)不用再計算已經(jīng)排好的部分

? ? ? ? {

? ? ? ? ? ? if(a[i] > a[i + 1])

? ? ? ? ? ? {

? ? ? ? ? ? ? ? temp = a[i];

? ? ? ? ? ? ? ? a[i] = a[i + 1];

? ? ? ? ? ? ? ? a[i + 1] = temp;

? ? ? ? ? ? }

? ? ? ? }

}

快速排序? 調用方法? quickSort(a,0,n);? θ(nlogn)

void quickSort (int a[] , int low , int high)

{

? ? if (high < low + 2)

? ? ? ? return;

? ? int start = low;

? ? int end = high;

? ? int temp;

? ? while (start < end)

? ? {

? ? ? ? while ( ++start < high && a[start] <= a[low]);//找到第一個比a[low]數(shù)值大的位子start

? ? ? ? while ( --end? > low? && a[end]? >= a[low]);//找到第一個比a[low]數(shù)值小的位子end

? ? ? ? //進行到此,a[end] < a[low] < a[start],但是物理位置上還是low < start < end,因此接下來交換a[start]和a[end],于是[low,start]這個區(qū)間里面全部比a[low]小的,[end,hight]這個區(qū)間里面全部都是比a[low]大的

? ? ? ? if (start < end)

? ? ? ? {

? ? ? ? ? ? temp = a[start];

? ? ? ? ? ? a[start]=a[end];

? ? ? ? ? ? a[end]=temp;

? ? ? ? }

? ? ? ? //在GCC編譯器下,該寫法無法達到交換的目的,a[start] ^= a[end] ^= a[start] ^= a[end];編譯器的問題

? ? }

? ? //進行到此,[low,end]區(qū)間里面的數(shù)都比a[low]小的,[end,higt]區(qū)間里面都是比a[low]大的,把a[low]放到中間即可

? ? //在GCC編譯器下,該寫法無法達到交換的目的,a[low] ^= a[end] ^= a[low] ^= a[end];編譯器的問題

? ? temp = a[low];

? ? a[low]=a[end];

? ? a[end]=temp;

? ? //現(xiàn)在就分成了3段了,由最初的a[low]樞紐分開的

? ? quickSort(a, low, end);

? ? quickSort(a, start, high);

}

注釋我也寫上了,這些算法基本上簡單的算法題都能應對了。

數(shù)據(jù)結構的題目我就遇到了鏈表翻轉,實現(xiàn)一個棧的結構,先進后出的,樹先跟,中跟,后跟遍歷,圖的DFS和BFS。代碼就不貼了,太長了。如果有忘記的,可以再去翻翻回顧一下。

三.面試

面試基本都是問你之前做過什么項目啦,遇到了哪些問題了,自己如何解決的。談談對XXX的看法等等這些問題,只要平時認真完成項目,其實面試反而問的東西更好答,因為都是關于你項目的,這些你最了解和清楚了。

好了,到此就是2018年2月上海地區(qū)除了BAT公司,招聘iOS開發(fā)工程師的行情了,比2年前,最大的體會就是面試面更廣了,要求更高了?,F(xiàn)在要求除了會OC,還要懂算法和數(shù)據(jù)結構,還有要么會ReactNative,或者PhoneGap一系列混合開發(fā)的框架,或者熟悉Swift,程序員要一直跟上主流才能不能被時代淘汰。才能具有競爭力?;畹嚼蠈W到老!最后希望大家都和我交流交流,我也是個iOS菜鳥,請大家多多指教!

(其實做為一個開發(fā)者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS學習交流群605315994,不管你是小白還是大牛歡迎入駐,大家一起交流學習,加群私聊群主就可以領取2018最全梳理的面試寶典和資料)就是下圖這份資料,希望你能找到理想中的工作。


面試寶典

著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 因為個人原因,換了一份工作,期間面試了有4,5家,基本都是D輪或者上市公司,也從他們的面試筆試中看到了自己的一些不...
    閑云清煙閱讀 342評論 0 2
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,890評論 0 33
  • 目錄 1. 棧和隊列1.用兩個隊列實現(xiàn)棧2.用兩個棧實現(xiàn)隊列3.實現(xiàn)一個棧,可以用常數(shù)級時間找出棧中的最小值4.判...
    MigrationUK閱讀 3,109評論 4 20
  • 離崗十歲長,玉府一相逢。 問姓驚初見,稱名億舊容。 別來落日圓,語罷凌鐘響。 望塵呼額道,守邊衛(wèi)國防。
    MBF夢閱讀 136評論 0 1
  • 《東京物語》是日本導演小津安二郎1953年的作品。 整個片子咋一看給人的感覺如記流水賬一般,平淡無奇。對有些人來說...
    四和子閱讀 416評論 0 0

友情鏈接更多精彩內容