iOS 面試總結

2021 面試心得

提筆已經是2022年1月1號,想了想還是準備寫一遍文章記錄一下,因為疫情的影響,可能很多小伙伴已經在自己公司待了至少2年以上吧,然后就是今天的一個跳槽高峰,從身邊朋友或者獵頭就能看出,除了金三銀四,金九銀十,感覺找工作的是從年頭到年尾,招聘的也是從年頭到年尾,Everyday~

今非昔比

還記得3年前跳槽,出去面試,基本上當天就有結果,要么過,要么不過,而現在真是各種拖延,也可能和跳槽的時間有關系, 我是9月份開始面試的,可能有些公司招人已經不是很著急了,所以建議看機會的大佬們,可以換個時間,我是深有體會??
面試時間變長,對于看機會的你來說,這將是一個很大的心理考驗,面試過的應該有同感吧!
此外還有一個比較重要的就是技術了,從boss上能看到,現在薪資很高,但是要求也很高,所以,想要入坑一個比較滿意的公司,那你的技術也要讓別人滿意,總結一句話:就是問的很深. 比如,我面阿里的螞蟻財富,因為我簡歷上寫了網絡協議相關的內容, 面試管就問,HTTP 1.0,HTTP2.0/HTTP3.0 一個接一個的問,可能有些公司只會問到HTTP1.0和HTTP2.0,然后就over了,后面再說具體面試題

準備

這次的跳槽我準備的時間確實很長,也與我自身平時的工作有關系吧,平時開發(fā)只做業(yè)務代碼開發(fā),沒有深入研究底層邏輯,具體準備的就是OC的底層原理,runtime,runLoop,多線程,鎖,性能優(yōu)化,離屏渲染,等等,這些,你可以看下小碼哥的課程,確實不錯,還有邏輯教育,不過邏輯教育的課程沒有接觸過深,只是試聽過幾節(jié),感覺還是有點東西,不過就是有的老師講課的方式,不好接受.除此之外,我還把swift重新溫習了一遍,這個還是必備的,因為Swift是一個趨勢,一些公司慢慢從OC轉到Swift,你可以從boss上看出來,比如得物就是純Swift,還有小紅書,最后也還是最重要的一部分就是算法,如果你想進大廠,那算法是必備的,我看的算法也是小碼哥的課程,講的確實很全面.

努力奮斗的五個月

如果自己有一個很強烈的想法,你想實現,那么對于平凡的我們來說,只有努力奮斗,沒有第二條路,除非,馬云爸爸是你家親戚(??),準備的幾個月基本上是每天早上做地鐵就是看自己準備的一些文檔,白天工作,中午休息的一個半小時,我會抽出來刷抖音的半小時,直接看視頻學習,然后晚上下班,那就是9點到11點,差不多每天晚上要花3小時,想想那一段時間,雖然很辛苦,但是確實也學習到了很多東西,也感謝媳婦對我的支持!
看視頻學習,其實這種高強度的大腦輸入,說真的,你可能很快就忘記了,那么怎么辦:

  • 看第二遍
  • 寫代碼,自己根據老師所講,進行源碼跟讀
  • 自己總結,做筆記

很多東西,只是聽聽是不行的,一定要自己去寫代碼,還有應用,要想想在平時開發(fā)的過程中,能不能把這些底層知識也運用到.舉個栗子:在使用NStimer的時候,持有self會出現循環(huán)應用的情況,那么解決這個問題,可以使用NSTimer+block的形式做,還有另外一種方式是使用NSProxy,我在目前的項目中去搜索發(fā)現很多三方庫也是使用的NSProxy

對于Swift,有些公司除了問你OC的問題,也會問一些Swift的問題,所以Swift你也是必須掌握的,比如:訪問權限,面向協議拷沸,閉包十绑,函數式編程,結構體和類的區(qū)別這些,當然不會問這么簡單,還有可選型的本質?lazy是怎么實現的,泛型的本質?

對于算法,只是看視頻聽課,是不夠的,我面試下來,B站,阿里的,還有百度的,其實問的算法沒有我們想象的那么難,問的比較多的就是二叉樹,鏈表,排序,對于大廠的面試,就是給你一個和leetCode一樣的編輯文本,直接敲出來,另外還要說出時間復雜度和空間復雜度

對于網絡,確實面試過程中問的比較多,也是一些常見的問題,HTTP/HTTPS的原理,為什么進行3次握手,TCP/UDP的區(qū)別,使用場景,后面再詳細說

下面我把自己要準備的一些清單,分享一下,希望可以幫到你,當然這只是一部分


image.png

遇到的問題

對于面試,不同面試官,由于個人喜好,不同,所以問問題也不同,有的會問的很細,有的可能只要你答出來思路就可以了,下面我列舉一些比較有代表性的問題,上面說的面試問的很深,怎么理解呢? 比如得物,當時面試官問我一個關于RunLoop的問題:使用RunLoop如何監(jiān)測頁面發(fā)生卡頓?這個面試題的答案就是新創(chuàng)建一個線程,并將這個線程加到RunLoop中,然后在這個創(chuàng)建的線程中加一個Timer,每隔1秒進行監(jiān)測,設置一個變量隨著定時器遞增,同時在RunLoop的kCFRunLoopBeforeWaitingkCFRunLoopAfterWaiting之間設置一個變量,然后將兩個變量進行比較,如果兩值的差值大于2秒,則說明有卡頓發(fā)生,具體代碼編寫,可以參考簡單監(jiān)測iOS卡頓

那么問題來了,你回答這些,面試官感覺還可以,然后會繼續(xù)問,如果監(jiān)聽到卡頓,怎么知道那地方有卡頓,堆棧信息怎么獲取呢?所有堆棧信息都可以獲取嗎?有沒有更好的獲取堆棧的方案? 一連三問,童靴們,你該有何感想?? 這就是我所說的面試深度,這個問題的答案可以參考下獲取任意線程調用棧的那些事,其實就是使用系統(tǒng)的backTrace_symbols

作為iOS開發(fā),對于鎖,應該都知道,包括互斥鎖, 自旋鎖,遞歸鎖,問的比較多的就是者的區(qū)別,以及在開發(fā)中使用到的鎖都是那些,NSLock是比較常用的,也是面試問的最多的,它是互斥鎖,是對mutex普通鎖的封裝,那么問題來了,這些你都知道,是不是感覺準備的OK了,我想說的是我也這么覺得哈哈~,然而現實就會打臉,在我面試餓了嗎的時候,面試官對于鎖的最后一個問題就是,如果出現了死鎖,我們如何檢測,如果去解決呢? 苦笑過

在面試京東的時候,有一個問題是這樣的:iOS的內存是有不同區(qū)域組成的,那么對于一個全局變量,初始化和未初始化的時候,所在的是同一塊區(qū)域嗎?

分析下這個問題,在iOS中內存主要是分為五大區(qū)域的:棧區(qū)峻凫、堆區(qū)、靜態(tài)區(qū)、常量區(qū)、代碼段,然而你不知道的是:

  • 未初始化的全局變量和靜態(tài)變量在BSS區(qū),即未初始化區(qū), .bss(Block Started by Symbol segment)
  • 已初始化的全局變量和靜態(tài)變量, 在數據區(qū), 即初始化區(qū), .data

其他詳細的介紹,可以看下iOS內存管理-內存五大區(qū)

MultiThreading 多線程

我把多線程單獨拿出來說,那么它的重要性就不言而喻了,不管是移動端或者后臺,面試是必問的,因為在面試之前,我準備的其實時間挺長的,對于多線程的各種使用以及面試問題,我都是寫代碼實踐過的,感覺,只要是多線程的面試問題,我絕對OK,信心滿滿,然后現實很骨感~

有一個經典的多線程的總結,我在這放一下:

image.png

中通快遞面試官的一個問題:如何中斷一個線程? 其實這個問題,在平時開發(fā)中遇到的可能性不大,但可能業(yè)務需求,所有面試官才會問,那么如何作答呢?在OC中,是沒有直接中斷線程的方法可以調用的,如果用Swift,可以使用DispatchWorkItem,但是如果是使用URLSession進行的網絡請求,每個task都有cancel方法,直接cancel掉就可以,如果是耗時的計算類線程,需要在合適的地方加上flag,在cancel時把flag置為false,線程就能及時終止.你學廢了嗎???????

還有一個我印象比較深刻的就是小紅書的面試官問的問題:對于全局隊列,
dispatch_queue_global_t dispatch_get_global_queue(intptr_t identifier, uintptr_t flags); 這個全局隊列使用的時候,可以根據傳入的參數不同,來讓線程按照一個優(yōu)先級來執(zhí)行,面試官的問題是,如何使用全局隊列來創(chuàng)建一個有序的任務隊?

dispatch_get_global_queue(intptr_t identifier, uintptr_t flags)使用時,第一個參數是可以傳入不同的值,官方提供的幾個如下:

  • define DISPATCH_QUEUE_PRIORITY_HIGH 2

  • define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

  • define DISPATCH_QUEUE_PRIORITY_LOW (-2)

  • define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

傳入不同的值,所得到的線程執(zhí)行的順序是不同的,代碼如下:

- (void)_test
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"start task 1");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"end task 1");
    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSLog(@"start task 2");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"end task 2");
    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"start task 3");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"end task 3");
    });
    NSLog(@">>>>>>>>>");
}

打印結果如下:

2022-01-02 11:51:11.734788+0800 Interview03-RunLoop[14921:446533] >>>>>>>>>
2022-01-02 11:51:11.734831+0800 Interview03-RunLoop[14921:446730] start task 1
2022-01-02 11:51:11.734852+0800 Interview03-RunLoop[14921:446729] start task 2
2022-01-02 11:51:11.734876+0800 Interview03-RunLoop[14921:446735] start task 3
2022-01-02 11:51:14.737209+0800 Interview03-RunLoop[14921:446729] end task 2
2022-01-02 11:51:14.737209+0800 Interview03-RunLoop[14921:446730] end task 1
2022-01-02 11:51:14.737220+0800 Interview03-RunLoop[14921:446735] end task 3

PS: 一定是有耗時的任務存在的呛踊,一定要3個任務都在同一個線程里面,否則就會有問題,路過的大佬,可以試試~

算法

今天最流行的詞就是"卷",算法的面試也是一樣,童鞋們,稍微有點規(guī)模的公司,多多少少都會問一些,大廠基本上是要求你手寫算法,或者給你一個編輯工具直接寫,對于一些小型公司,可能會問一些思路,我遇到的公司,分享一下:

B站
手寫算法,一共4面,寫了3個算法

  • 合并兩個有序的鏈表
  • 二叉樹翻轉
  • 在數組中找出和為9的值(leetCode原題)

小紅書
手寫算法,因為我是現場面試的,如果是視頻,應該是遠程編輯

  • 給一個4位數,寫一個算法,找出該數中是否包含4和7
    大致是這個意思,我記不太清楚了

百度
手寫算法:

  • 給一個ip地址,然后寫一個函數將ip作為字符串返回,并實現字符串轉回原來的ip(就是ip <=> string 之間相互轉換)

阿里本地生活
視頻面試,提供編輯代碼工具,自己寫代碼:
具體我記不清楚了,大致的意思是:

  • 給你一個亂序的數組,然后將數組中的元素,按照小啦撮、大谭网、小、大的順序排序

上面是我印象比較深刻的,還有一些小公司會問一些排序的,就不多說了.
那么如何應對,我分享一下我的經驗,之前在沒有學習算法的時候感覺應該挺難的,其實,如果你去研究學習,花時間投入,一些面試常問的二叉樹,鏈表,排序,并沒有那么難,除非一些動態(tài)規(guī)劃的,如果你是年薪60W+的,可能會問,還有算法的難度還和你面試的部門有關系,看面試部門的要求,你是高級還是專家,或者架構師,要求都是不一樣的,考察的難度也是不一樣的,具體的情況要具體分析

如果你刷題多了,會發(fā)現很多題目是有套路的,比如排序的,或者鏈表,很大部分題可以使用雙指針或者多指針去做,還有一些"基本功" 就是一些基本的要求,你一定要在沒有參考的情況下,達到手寫代碼,比如,反轉二叉樹,前序遍歷,后序遍歷,層序遍歷,計算二叉樹的高度和寬度,求一個鏈表的倒數第k個節(jié)點等,這些東西你一定要胸有成竹,然后再去刷題,效果會更好~
還有一個最大的好處就是,你可能在面試的時候,會遇到原題或者比較類似的題目, 那豈不是一舉兩得~
在這推薦一個大佬的公眾號:labuladong,里面文章不錯,希望對你有所幫助~

如何面試

準備算法的時候,需要刷題,面試也是一樣,需要刷,但刷面試,是有套路的,那就是,你要先面試小公司,我有一個朋友,感覺面試小公司沒有意義,其實我感覺并不是,比如我,因為我之前準備的時候,是看了很多視頻,很多東西對于你的大腦來說都是輸入的過程,而面試,對于大腦來說,是輸出的過程,也是一個痛苦的過程,面試過的童鞋應該都深有體會!我記得我面試第一家是追書神器,一個小公司,他們那邊iOS團隊就3個人,但是那個面試官問的就很全面,基本上把我準備的都問了一遍,面試了1個小時,面試后的感覺是,我頭痛[捂臉],把所有的輸入轉化為輸入,這種感覺,你懂的~

一定要把你最想要的公司放在最后去面試,這樣你整個的面試狀態(tài)以及面試的心情是不一樣的,Good Luck To You!

大廠的要求

越是比較有名氣的公司,要求越高,高在哪里呢? 有可能簡歷都不過,如果簡歷過了,面試的每一輪,都有可能不過,我這次面試,機會也不少,讓我感觸最深的就是,越是大公司,面試官就越低調,而且人都很隨和,沒有一點架子,讓我印象最深的就是現場面試小紅書,當我等在面試會議室的時候,面試官進來,先給我握手,然后再讓我坐,還有B站的面試,面試法都很nice,會讓你感覺很好!

上面說好的一面,下面說不好的一面,那就是技術要求很高,在給你出的面試問題中,特別是一些死的東西,你一定要百分百的答對,如果能舉一反三最好,特別是一些大廠,比如阿里,京東,如果問你10個問題,你答對9個,那么不好意思,你這次面試還是失敗的,這就是大廠的要求,還有就是手寫代碼的能力,如果讓你手寫一段代碼,然后你可能不會寫,或者激動等其他原因,你給面試官說,可以說下思路嗎?基本面試官會答應,但是就算你說的再好,這次面試還是失敗的,因為面試官不知道你手寫代碼的能力, 現實就是這樣殘酷!

一個人的運氣

不知道是不是10月之后,企業(yè)是不是只做人才儲備,還是不著急,所有的面試安排,給人的感覺就是拖拉,再加上一些假期,時間就更長,然后還有中途停招的[捂臉],不光是我遇到過,我朋友也遇到多,面試都三輪了,說崗位沒有了,我遇到的是平安的,一面過了,然后HR給我打電話說,職位停招了,還有百度的,二面的郵件都發(fā)了,等到快面試的時候,給我說職位停招了,想哭的心都有,所以,在你沒有收到offer之前,一切都是未知,這次對我來說還有一個最大的遺憾就是被B站給拒了,去B站現場面試,從下午1點一直面試到晚上6點多,出去的時候,外面天都黑了,等我走的時候,第四個面試官還加我微信,讓我準備薪資證明,有圖為證:


image.png

B站的面試,最終還是沒有給offer??,當時我的心情是如此的奔潰~,但現在我雖然沒有去B站,目前還是在一個我感覺不錯的公司,這就是傳說中的上帝給你關了一扇門,然后給你開了一扇窗吧!

我說這些并不是讓你感覺到灰心,恰恰相反,希望路過的大佬,把握每一次機會,珍惜珍惜再珍惜,有些大廠沒有給offer,并不是你不優(yōu)秀,技術不行,心態(tài)要調整好~ 你是最棒滴~

本次面試對自己的影響和后期計劃

這次面試,其實對我影響挺大的,告訴了我,切莫要揮霍青春了,如果我早在一年前就開始做知識的儲備積累,早一些去學習研究各種算法,這次面試也不必花費這么長時間去準備,還有就是在開發(fā)中就要思考,實現業(yè)務功能或者遇到問題時,這個代碼的實現方式,底層是怎么實現的,原理是什么,有沒有更好的解法,其他的大佬遇到這個問題是怎么解決的,就如上面我說的多線程,如果你不自己去寫Demo,你永遠不知道還能這么玩,而且里面還有坑,大廠的大佬,也就是在日常開發(fā)中,多做了研究,總結,踩坑,思考~

只是幾個月的努力,其實遠遠不夠的,貴在平時吧~ 一起加油!

這次面試花費的時間挺長的,也感謝之前努力的自己,在此面試了阿里,B站,京東,得物,聲網,百度,合合(掃描全能王app),哈羅出行,小紅書等在文章末尾,我將自己的一些面試遇到的問題,整理了一份放在github上,有需要的請自取!寫作不易,還望各位大佬,點贊支持,哈哈~

點我有驚喜

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末赃春,一起剝皮案震驚了整個濱河市愉择,隨后出現的幾起案子,更是在濱河造成了極大的恐慌织中,老刑警劉巖锥涕,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異狭吼,居然都是意外死亡层坠,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門刁笙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來破花,“玉大人谦趣,你說我怎么就攤上這事【善颍” “怎么了蔚润?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尺栖。 經常有香客問我嫡纠,道長,這世上最難降的妖魔是什么延赌? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任除盏,我火速辦了婚禮,結果婚禮上挫以,老公的妹妹穿的比我還像新娘者蠕。我一直安慰自己,他們只是感情好掐松,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布踱侣。 她就那樣靜靜地躺著,像睡著了一般大磺。 火紅的嫁衣襯著肌膚如雪抡句。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天杠愧,我揣著相機與錄音待榔,去河邊找鬼。 笑死流济,一個胖子當著我的面吹牛锐锣,可吹牛的內容都是我干的。 我是一名探鬼主播绳瘟,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼雕憔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糖声?” 一聲冷哼從身側響起斤彼,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姨丈,沒想到半個月后畅卓,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蟋恬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年翁潘,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼争。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拜马,死狀恐怖渗勘,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情俩莽,我是刑警寧澤旺坠,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站扮超,受9級特大地震影響取刃,放射性物質發(fā)生泄漏。R本人自食惡果不足惜出刷,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一璧疗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馁龟,春花似錦崩侠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矢炼,卻和暖如春系瓢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裸删。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工八拱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阵赠,地道東北人涯塔。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像清蚀,于是被迫代替她去往敵國和親匕荸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • 更新 面試基本已經結束了枷邪,目前已拿頭條榛搔、百度、騰訊offer东揣,現在可以好好來寫寫總結了践惑,關于面試題,可能沒那么多時...
    Tamp_閱讀 32,213評論 92 596
  • 關于面試題 打個比方嘶卧,如果把找工作理解成考大學尔觉,面試就是高考,市面上的“真題”就是模擬試卷芥吟。我們會很容易傾向于在面...
    樂逍遙11閱讀 468評論 0 1
  • 前言 在嚴峻的iOS市場中競爭侦铜, 沒有掌握和了解一些具有優(yōu)勢的技術性知識专甩,你怎么與別人進行PK,又怎么征服你的面試...
    iOS弗森科閱讀 10,176評論 2 49
  • 【百度】(二面掛) 一面: 1.說下線程和進程的區(qū)別 2.如何保證線程安全 3.寫個算法钉稍,輸出2~100的素數(然...
    文博同學閱讀 167評論 0 0
  • 推薦閱讀:iOS開發(fā)——BAT面試題合集(持續(xù)更新中) 一面 1涤躲、介紹項目 2、在KVO中贡未,他是怎么知道監(jiān)聽的對象...
    iOS開發(fā)之家閱讀 1,165評論 1 10