點贊再看,養(yǎng)成習慣钝腺,
作為一個開發(fā)者抛姑,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:761407670 艳狐,不管你是小白還是大牛歡迎入駐 定硝,分享BAT,阿里面試題、面試經(jīng)驗毫目,討論技術蔬啡, 大家一起交流學習成長!
在博主認為镀虐,對于iOS面試以及進階的最佳學習方法莫過于刷題+博客+書籍+總結箱蟆,前三者博主將淋漓盡致地揮毫于這篇博客文章中,至于總結在于個人刮便,實際上越到后面你會發(fā)現(xiàn)面試并不難空猜,其次就是在刷題的過程中有沒有去思考,刷題只是次之恨旱,這又是一個層次了辈毯,這里暫時不提后面再談。
博主總結了一系列大廠面試中常問的面試技術點搜贤,深入解析以及答案漓摩,將為最近準備面試的各開發(fā)者去大廠保駕護航,
何謂面試入客? 博主所理解的面試管毙,它是一個過程,是不斷沉淀桌硫、不斷總結夭咬、善于傳達自己的專業(yè)領域技術以及解決問題能力的過程。以下是博主總結的一些面試題铆隘,文中如有錯誤卓舵,懇請各位大佬指出!
1膀钠、NSArray與NSSet的區(qū)別掏湾?
- NSArray內(nèi)存中存儲地址連續(xù),而NSSet不連續(xù)
- NSSet效率高肿嘲,內(nèi)部使用hash查找融击;NSArray查找需要遍歷
- NSSet通過anyObject訪問元素,NSArray通過下標訪問
2雳窟、NSHashTable與NSMapTable尊浪?
- NSHashTable是NSSet的通用版本,對元素弱引用,可變類型拇涤;可以在訪問成員時copy
- NSMapTable是NSDictionary的通用版本捣作,對元素弱引用,可變類型鹅士;可以在訪問成員時copy
(注:NSHashTable與NSSet的區(qū)別:NSHashTable可以通過option設置元素弱引用/copyin券躁,只有可變類型。但是添加對象的時候NSHashTable耗費時間是NSSet的兩倍掉盅。
NSMapTable與NSDictionary的區(qū)別:同上)
3嘱朽、屬性關鍵字assign、retain怔接、weak搪泳、copy
- assign:用于基本數(shù)據(jù)類型和結構體。如果修飾對象的話扼脐,當銷毀時岸军,屬性值不會自動置nil,可能造成野指針瓦侮。
- weak:對象引用計數(shù)為0時艰赞,屬性值也會自動置nil
- retain:強引用類型,ARC下相當于strong肚吏,但block不能用retain修飾方妖,因為等同于assign不安全。
- strong:強引用類型罚攀,修飾block時相當于copy党觅。
4、weak屬性如何自動置nil的斋泄?
- Runtime會對weak屬性進行內(nèi)存布局杯瞻,構建hash表:以weak屬性對象內(nèi)存地址為key,weak屬性值(weak自身地址)為value炫掐。當對象引用計數(shù)為0 dealloc時魁莉,會將weak屬性值自動置nil。
5募胃、Block的循環(huán)引用旗唁、內(nèi)部修改外部變量、三種block
- block強引用self痹束,self強引用block
- 內(nèi)部修改外部變量:block不允許修改外部變量的值检疫,這里的外部變量指的是棧中指針的內(nèi)存地址。__block的作用是只要觀察到變量被block使用参袱,就將外部變量在棧中的內(nèi)存地址放到堆中电谣。
- 三種block:NSGlobalBlack(全局)秽梅、NSStackBlock(棧block)抹蚀、NSMallocBlock(堆block)
6剿牺、KVO底層實現(xiàn)原理?手動觸發(fā)KVO环壤?swift如何實現(xiàn)KVO晒来?
- KVO原理:當觀察一個對象時,runtime會動態(tài)創(chuàng)建繼承自該對象的類郑现,并重寫被觀察對象的setter方法湃崩,重寫的setter方法會負責在調(diào)用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創(chuàng)建的子類接箫,對象就變成子類的實例攒读。
- 如何手動觸發(fā)KVO:在setter方法里,手動實現(xiàn)NSObject兩個方法:willChangeValueForKey辛友、didChangeValueForKey
- swift的kvo:繼承自NSObject的類薄扁,或者直接willset/didset實現(xiàn)。
7废累、categroy為什么不能添加屬性邓梅?怎么實現(xiàn)添加?與Extension的區(qū)別邑滨?category覆蓋原類方法日缨?多個category調(diào)用順序
- Runtime初始化時categroy的內(nèi)存布局已經(jīng)確定,沒有ivar掖看,所以默認不能添加屬性匣距。
- 使用runtime的關聯(lián)對象,并重寫setter和getter方法哎壳。
- Extenstion編譯期創(chuàng)建墨礁,可以添加成員變量ivar,一般用作隱藏類的信息耳峦。必須要有類的源碼才可以添加恩静,如NSString就不能創(chuàng)建Extension。
- category方法會在runtime初始化的時候copy到原來前面蹲坷,調(diào)用分類方法的時候直接返回驶乾,不再調(diào)用原類。如何保持原類也調(diào)用
- 多個category的調(diào)用順序按照:Build Phases ->Complie Source 中的編譯順序循签。
8级乐、 block的本質(zhì)是什么?有幾種block县匠?分別是怎樣產(chǎn)生的风科?
block與函數(shù)類似撒轮,只不過是直接定義在另一個函數(shù)里,和定義它的那個函數(shù)共享同一個范圍內(nèi)的東西贼穆,
block的強大之處是:在聲明它的范圍里题山,所有變量都可以為其捕獲,這也就是說故痊,那個范圍內(nèi)的全部變量顶瞳,在block依然可以用,默認情況下愕秫,為block捕獲的變量慨菱,是不可以在block里修改的,不過聲明的時候可以加上__block修飾符戴甩,這樣就可以再block內(nèi)修改了符喝。
面試題持續(xù)更新記得關注我哦!
9甜孤、對 runtime 的理解协饲。——主要是方法調(diào)用時如何查找緩存课蔬,如何找到方法囱稽,找不到方法時怎么轉(zhuǎn)發(fā),對象的內(nèi)存布局
OC中向?qū)ο蟀l(fā)送消息時二跋,runtime會根據(jù)對象的isa指針找到對象所屬的類战惊,然后在該類的方法列表和父類的方法列表中尋找方法執(zhí)行。如果在最頂層父類中沒找到方法執(zhí)行扎即,就會進行消息轉(zhuǎn)發(fā):Method resoution(實現(xiàn)方法)吞获、fast forwarding(轉(zhuǎn)發(fā)給其他對象)、normal forwarding(完整消息轉(zhuǎn)發(fā)谚鄙「骺剑可以轉(zhuǎn)發(fā)給多個對象)
10、runtime 中闷营,SEL和IMP的區(qū)別?
每個類對象都有一個方法列表烤黍,方法列表存儲方法名、方法實現(xiàn)傻盟、參數(shù)類型速蕊,SEL是方法名(編號),IMP指向方法實現(xiàn)的首地址
11娘赴、autoreleasepool的原理和使用場景?
- 若干個autoreleasepoolpage組成的雙向鏈表的棧結構规哲,objc_autoreleasepoolpush、objc_autoreleasepoolpop诽表、objc_autorelease
- 使用場景:多次創(chuàng)建臨時變量導致內(nèi)存上漲時唉锌,需要延遲釋放
- autoreleasepoolpage的內(nèi)存結構:4k存儲大小
12隅肥、Autorelase對象什么時候釋放?
在沒有手加Autorelease Pool的情況下袄简,Autorelease對象是在當前的runloop迭代結束時釋放的腥放,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop。
13痘番、Runloop與線程的關系捉片?Runloop的mode? Runloop的作用平痰?內(nèi)部機制汞舱?
- 每一個線程都有一個runloop,主線程的runloop默認啟動宗雇。
- mode:主要用來指定事件在運行時循環(huán)的優(yōu)先級
- 作用:保持程序的持續(xù)運行昂芜、隨時處理各種事件、節(jié)省cpu資源(沒事件休息釋放資源)赔蒲、渲染屏幕UI
14泌神、iOS中使用的鎖、死鎖的發(fā)生與避免
- @synchronized舞虱、信號量欢际、NSLock等
- 死鎖:多個線程同時訪問同一資源,造成循環(huán)等待矾兜。GCD使用異步線程损趋、并行隊列
15、NSOperation和GCD的區(qū)別
- GCD底層使用C語言編寫高效椅寺、NSOperation是對GCD的面向?qū)ο蟮姆庋b浑槽。對于特殊需求,如取消任務返帕、設置任務優(yōu)先級桐玻、任務狀態(tài)監(jiān)聽,NSOperation使用起來更加方便荆萤。
- NSOperation可以設置依賴關系镊靴,而GCD只能通過dispatch_barrier_async實現(xiàn)
- NSOperation可以通過KVO觀察當前operation執(zhí)行狀態(tài)(執(zhí)行/取消)
- NSOperation可以設置自身優(yōu)先級(queuePriority)。GCD只能設置隊列優(yōu)先級(DISPATCH_QUEUE_PRIORITY_DEFAULT)链韭,無法在執(zhí)行的block中設置優(yōu)先級
- NSOperation可以自定義operation如NSInvationOperation/NSBlockOperation偏竟,而GCD執(zhí)行任務可以自定義封裝但沒有那么高的代碼復用度
- GCD高效,NSOperation開銷相對高
16梧油、oc與js交互
- 攔截url
- JavaScriptCore(只適用于UIWebView)
- WKScriptMessageHandler(只適用于WKWebView)
- WebViewJavaScriptBridge(第三方框架)
17苫耸、swift相比OC有什么優(yōu)勢?
18儡陨、struct褪子、Class的區(qū)別
- class可以繼承量淌,struct不可以
- class是引用類型,struct是值類型
- struct在function里修改property時需要mutating關鍵字修飾
19嫌褪、訪問控制關鍵字(public呀枢、open、private笼痛、filePrivate裙秋、internal)
- public與open:public在module內(nèi)部中,class和func都可以被訪問/重載/繼承缨伊,外部只能訪問摘刑;而open都可以
- private與filePrivate:private修飾class/func,表示只能在當前class源文件/func內(nèi)部使用刻坊,外部不可以被繼承和訪問枷恕;而filePrivate表示只能在當前swift源文件內(nèi)訪問
- internal:在整個模塊或者app內(nèi)都可以訪問,默認訪問級別谭胚,可寫可不寫
20徐块、OC與Swift混編
- OC調(diào)用swift:import "工程名-swift.h” @objc
- swift調(diào)用oc:橋接文件
21、map灾而、filter胡控、reduce?map與flapmap的區(qū)別旁趟?
-
map:數(shù)組中每個元素都經(jīng)過某個方法轉(zhuǎn)換昼激,最后返回新的數(shù)組(xx.map({[圖片上傳失敗...(image-531157-1592632529543)]
0}))
flatmap:同map類似,區(qū)別在flatmap返回的數(shù)組不存在nil轻庆,并且會把optional解包癣猾;而且還可以把嵌套的數(shù)組打開變成一個([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6])
filter:用戶篩選元素(xxx.filter({$0 > 25}),篩選出大于25的元素組成新數(shù)組)
reduce:把數(shù)組元素組合計算為一個值余爆,并接收初始值()
22纷宇、guard與defer
- guard用于提前處理錯誤數(shù)據(jù),else退出程序蛾方,提高代碼可讀性
- defer延遲執(zhí)行像捶,回收資源。多個defer反序執(zhí)行桩砰,嵌套defer先執(zhí)行外層拓春,后執(zhí)行內(nèi)層
23、try亚隅、try?與try!
- try:手動捕捉異常
- try?:系統(tǒng)幫我們處理硼莽,出現(xiàn)異常返回nil;沒有異常返回對應的對象
- try!:直接告訴系統(tǒng)煮纵,該方法沒有異常懂鸵。如果出現(xiàn)異常程序會crash
24偏螺、@autoclosure:把一個表達式自動封裝成閉包
25、throws與rethrows:throws另一個throws時匆光,將前者改為rethrows
26套像、App啟動優(yōu)化策略?main函數(shù)執(zhí)行前后怎么優(yōu)化
- 啟動時間 = pre-main耗時+main耗時
- pre-main階段優(yōu)化:
- 刪除無用代碼
- 抽象重復代碼
- +load方法做的事情延遲到initialize中终息,或者+load的事情不宜花費太多時間
- 減少不必要的framework夺巩,或者優(yōu)化已有framework
- Main階段優(yōu)化
- didFinishLauchingwithOptions里代碼延后執(zhí)行
- 首次啟動渲染的頁面優(yōu)化
27、crash防護周崭?
- unrecognized selector crash
- KVO crash
- NSNotification crash
- NSTimer crash
- Container crash(數(shù)組越界柳譬,插nil等)
- NSString crash (字符串操作的crash)
- Bad Access crash (野指針)
- UI not on Main Thread Crash (非主線程刷UI (機制待改善))
28、內(nèi)存泄露問題休傍?
主要集中在循環(huán)引用問題中征绎,如block蹲姐、NSTime磨取、perform selector引用計數(shù)問題。
29柴墩、UI卡頓優(yōu)化忙厌?
30、架構&設計模式
- MVC設計模式介紹
- MVVM介紹江咳、MVC與MVVM的區(qū)別逢净?
- ReactiveCocoa的熱信號與冷信號
- 緩存架構設計LRU方案
- SDWebImage源碼,如何實現(xiàn)解碼
- AFNetWorking源碼分析
- 組件化的實施歼指,中間件的設計
- 哈希表的實現(xiàn)原理爹土?如何解決沖突
31、數(shù)據(jù)結構&算法
- 快速排序踩身、歸并排序
- 二維數(shù)組查找(每一行都按照從左到右遞增的順序排序胀茵,每一列都按照從上到下遞增的順序排序。請完成一個函數(shù)挟阻,輸入這樣的一個二維數(shù)組和一個整數(shù)琼娘,判斷數(shù)組中是否含有該整數(shù))
- 二叉樹的遍歷:判斷二叉樹的層數(shù)
- 單鏈表判斷環(huán)
32、計算機基礎
- http與https附鸽?socket編程脱拼?tcp、udp坷备?get與post熄浓?
- tcp三次握手與四次握手
- 進程與線程的區(qū)別
下面還有一些更干的面試題,你值得擁有省撑!
招聘一個靠譜的 iOS
github里面有大神附上了答案
招聘一個靠譜的 iOS 答案
這里還有MrPeak大神的中級面試題
iOS 中級面試題
下面是答案
iOS 中級面試題 答案
推薦
- 直擊2020——iOS 面試題大全(補充完整版)
- “新”攜程赌蔑,阿里谎柄,騰訊iOS面試常見問題合集(附答案)
- 我是如何同時拿到阿里和騰訊offer的
- 騰訊&阿里&美團&快手&字節(jié)等10公司面經(jīng)
- 騰訊社招iOS面試記錄
- 最新阿里騰訊頭條美團等iOS面試總結
歡迎大家關注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷模板,歡迎Star惯雳!