目錄
1、iOS 基礎(chǔ)題
2、iOS 實(shí)戰(zhàn)題
3、網(wǎng)絡(luò)題
4、計(jì)算機(jī)系統(tǒng)題
5、設(shè)計(jì)模式題
6、架構(gòu) & 設(shè)計(jì)題
7、數(shù)據(jù)結(jié)構(gòu)&算法題
大小廠基礎(chǔ)面試篇:
小編這里有準(zhǔn)備一些面試進(jìn)階資料,最新面試大廠常問(wèn)面試答案一份。希望真心能夠幫助到大家提升技術(shù)!
1,分類和擴(kuò)展有什么區(qū)別?可以分別用來(lái)做什么?分類有哪些局限性?分類的結(jié)構(gòu)體里面有哪些成員?
2,講一下atomic的實(shí)現(xiàn)機(jī)制;為什么不能保證絕對(duì)的線程安全(最好可以結(jié)合場(chǎng)景來(lái)說(shuō))?
3,被weak修飾的對(duì)象在被釋放的時(shí)候會(huì)發(fā)生什么?是如何實(shí)現(xiàn)的?知道sideTable么?里面的結(jié)構(gòu)可以畫出來(lái)么?
4,Autoreleasepool 所使用的數(shù)據(jù)結(jié)構(gòu)是什么? AutoreleasePoolPage 結(jié)構(gòu)體了解么?
5,講一下對(duì)象,類對(duì)象,元類,跟元類結(jié)構(gòu)體的組成以及他們是如何相關(guān)聯(lián)的?為什么對(duì)象方法沒(méi)有保存的對(duì)象結(jié)構(gòu)體里,而是保存在類對(duì)象的結(jié)構(gòu)體里?
6,iOS 中內(nèi)省的幾個(gè)方法? class 方法和 objc_getClass 方法有什么區(qū)別?
7,RunLoop的作用是什么?它的內(nèi)部工作機(jī)制了解么?(最好結(jié)合線程和內(nèi)存管理來(lái)說(shuō))
8,哪些場(chǎng)景可以觸發(fā)離屏渲染?(知道多少說(shuō)多少)
2、iOS 實(shí)戰(zhàn)題
1,有哪些場(chǎng)景是NSOperation比GCD更容易實(shí)現(xiàn)的?(或是NSOperation優(yōu)于GCD的幾點(diǎn),知道多少說(shuō)多少)
2,App 啟動(dòng)優(yōu)化策略?最好結(jié)合啟動(dòng)流程來(lái)說(shuō)(main()函數(shù)的執(zhí)行前后都分別說(shuō)一下,知道多少說(shuō)多少)
3,App 無(wú)痕埋點(diǎn)的思路了解么?你認(rèn)為理想的無(wú)痕埋點(diǎn)系統(tǒng)應(yīng)該具備哪些特點(diǎn)?(知道多少說(shuō)多少)
4,你知道有哪些情況會(huì)導(dǎo)致app崩潰,分別可以用什么方法攔截并化解?(知道多少說(shuō)多少)
5,你知道有哪些情況會(huì)導(dǎo)致app卡頓,分別可以用什么方法來(lái)避免?(知道多少說(shuō)多少)
3、網(wǎng)絡(luò)題
1,App 網(wǎng)絡(luò)層有哪些優(yōu)化策略?
2,TCP為什么要三次握手,四次揮手?
3,HTTPS的握手流程?為什么密鑰的傳遞需要使用非對(duì)稱加密?雙向認(rèn)證了解么?
4,HTTPS是如何實(shí)現(xiàn)驗(yàn)證身份和驗(yàn)證完整性的?
5,如何用Charles抓HTTPS的包?其中原理和流程是什么?
4、計(jì)算機(jī)系統(tǒng)題
1,了解編譯的過(guò)程么?分為哪幾個(gè)步驟?
2,靜態(tài)鏈接了解么?靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別?
3,static和const有什么區(qū)別?
4,什么時(shí)候會(huì)出現(xiàn)死鎖?如何避免?
5,有哪幾種鎖?各自的原理?它們之間的區(qū)別是什么?最好可以結(jié)合使用場(chǎng)景來(lái)說(shuō)
5、設(shè)計(jì)模式題
1,除了單例,觀察者設(shè)計(jì)模式以外,還知道哪些設(shè)計(jì)模式?分別介紹一下
2,iOS SDK 里面有哪些設(shè)計(jì)模式的實(shí)踐?
3,設(shè)計(jì)模式的成員構(gòu)成以及工作機(jī)制是什么?
6、架構(gòu) & 設(shè)計(jì)題
1,MVC和MVVM的區(qū)別?MVVM和MVP的區(qū)別?
2,面向?qū)ο蟮膸讉€(gè)設(shè)計(jì)原則了解么?最好可以結(jié)合場(chǎng)景來(lái)說(shuō)。
3,可以說(shuō)幾個(gè)重構(gòu)的技巧么?你覺得重構(gòu)適合什么時(shí)候來(lái)做?
4,你覺得框架和設(shè)計(jì)模式的區(qū)別是什么?
5,看過(guò)哪些第三方框架的源碼,它們是怎么設(shè)計(jì)的?設(shè)計(jì)好的地方在哪里,不好的地方在哪里,如何改進(jìn)?(這道題的后三個(gè)問(wèn)題的難度已經(jīng)很高了,如果不是太N的公司不建議深究)
7、數(shù)據(jù)結(jié)構(gòu)&算法題
1,鏈表和數(shù)組的區(qū)別是什么?插入和查詢的時(shí)間復(fù)雜度分別是多少?
2,哈希表是如何實(shí)現(xiàn)的?如何解決地址沖突?
3,排序題:冒泡排序,選擇排序,插入排序,快速排序(二路,三路)能寫出那些?
4,鏈表題:如何檢測(cè)鏈表中是否有環(huán)?如何刪除鏈表中等于某個(gè)值的所有節(jié)點(diǎn)?
5,數(shù)組題:如何在有序數(shù)組中找出和等于給定值的兩個(gè)元素?如何合并兩個(gè)有序的數(shù)組之后保持有序?
6,二叉樹題:如何反轉(zhuǎn)二叉樹?如何驗(yàn)證兩個(gè)二叉樹是完全相等的?
大廠高級(jí)面試篇:
1、NSArray與NSSet的區(qū)別?
- NSArray內(nèi)存中存儲(chǔ)地址連續(xù),而NSSet不連續(xù)
- NSSet效率高,內(nèi)部使用hash查找;NSArray查找需要遍歷
- NSSet通過(guò)anyObject訪問(wèn)元素,NSArray通過(guò)下標(biāo)訪問(wèn)
2、NSHashTable與NSMapTable?
- NSHashTable是NSSet的通用版本,對(duì)元素弱引用,可變類型;可以在訪問(wèn)成員時(shí)copy
- NSMapTable是NSDictionary的通用版本,對(duì)元素弱引用,可變類型;可以在訪問(wèn)成員時(shí)copy
(注:NSHashTable與NSSet的區(qū)別:NSHashTable可以通過(guò)option設(shè)置元素弱引用/copyin,只有可變類型。但是添加對(duì)象的時(shí)候NSHashTable耗費(fèi)時(shí)間是NSSet的兩倍。
NSMapTable與NSDictionary的區(qū)別:同上)
3、屬性關(guān)鍵字assign、retain、weak、copy
- assign:用于基本數(shù)據(jù)類型和結(jié)構(gòu)體。如果修飾對(duì)象的話,當(dāng)銷毀時(shí),屬性值不會(huì)自動(dòng)置nil,可能造成野指針。
- weak:對(duì)象引用計(jì)數(shù)為0時(shí),屬性值也會(huì)自動(dòng)置nil
- retain:強(qiáng)引用類型,ARC下相當(dāng)于strong,但block不能用retain修飾,因?yàn)榈韧赼ssign不安全。
- strong:強(qiáng)引用類型,修飾block時(shí)相當(dāng)于copy。
4、weak屬性如何自動(dòng)置nil的?
- Runtime會(huì)對(duì)weak屬性進(jìn)行內(nèi)存布局,構(gòu)建hash表:以weak屬性對(duì)象內(nèi)存地址為key,weak屬性值(weak自身地址)為value。當(dāng)對(duì)象引用計(jì)數(shù)為0 dealloc時(shí),會(huì)將weak屬性值自動(dòng)置nil。
5、Block的循環(huán)引用、內(nèi)部修改外部變量、三種block
- block強(qiáng)引用self,self強(qiáng)引用block
- 內(nèi)部修改外部變量:block不允許修改外部變量的值,這里的外部變量指的是棧中指針的內(nèi)存地址。__block的作用是只要觀察到變量被block使用,就將外部變量在棧中的內(nèi)存地址放到堆中。
- 三種block:NSGlobalBlack(全局)、NSStackBlock(棧block)、NSMallocBlock(堆block)
6、KVO底層實(shí)現(xiàn)原理?手動(dòng)觸發(fā)KVO?swift如何實(shí)現(xiàn)KVO?
- KVO原理:當(dāng)觀察一個(gè)對(duì)象時(shí),runtime會(huì)動(dòng)態(tài)創(chuàng)建繼承自該對(duì)象的類,并重寫被觀察對(duì)象的setter方法,重寫的setter方法會(huì)負(fù)責(zé)在調(diào)用原setter方法前后通知所有觀察對(duì)象值得更改,最后會(huì)把該對(duì)象的isa指針指向這個(gè)創(chuàng)建的子類,對(duì)象就變成子類的實(shí)例。
- 如何手動(dòng)觸發(fā)KVO:在setter方法里,手動(dòng)實(shí)現(xiàn)NSObject兩個(gè)方法:willChangeValueForKey、didChangeValueForKey
- swift的kvo:繼承自NSObject的類,或者直接willset/didset實(shí)現(xiàn)。
7、categroy為什么不能添加屬性?怎么實(shí)現(xiàn)添加?與Extension的區(qū)別?category覆蓋原類方法?多個(gè)category調(diào)用順序
- Runtime初始化時(shí)categroy的內(nèi)存布局已經(jīng)確定,沒(méi)有ivar,所以默認(rèn)不能添加屬性。
- 使用runtime的關(guān)聯(lián)對(duì)象,并重寫setter和getter方法。
- Extenstion編譯期創(chuàng)建,可以添加成員變量ivar,一般用作隱藏類的信息。必須要有類的源碼才可以添加,如NSString就不能創(chuàng)建Extension。
- category方法會(huì)在runtime初始化的時(shí)候copy到原來(lái)前面,調(diào)用分類方法的時(shí)候直接返回,不再調(diào)用原類。如何保持原類也調(diào)用(http://www.itdecent.cn/p/40e28c9f9da5)。
- 多個(gè)category的調(diào)用順序按照:Build Phases ->Complie Source 中的編譯順序。
小編推薦文章閱讀:新2020iOS面試和答案(不斷更新中)
這里最新面試大廠常問(wèn)面試答案一份。希望真心能夠幫助到大家提升技術(shù)!
結(jié)語(yǔ)
iOS面試中刷題只是一方面準(zhǔn)備,但是,好的面試機(jī)會(huì),離不開技術(shù)的支持,在找工作的同時(shí),不要忘記提升自身技術(shù),希望求職中的iOS開發(fā)者,找到一份自己滿意的工作!