1、NSArray與NSSet的區(qū)別?
- NSArray內(nèi)存中存儲地址連續(xù),而NSSet不連續(xù)
- NSSet效率高,內(nèi)部使用hash查找;NSArray查找需要遍歷
- NSSet通過anyObject訪問元素,NSArray通過下標(biāo)訪問
2、NSHashTable與NSMapTable?
- NSHashTable是NSSet的通用版本,對元素弱引用,可變類型;可以在訪問成員時copy
- NSMapTable是NSDictionary的通用版本,對元素弱引用,可變類型;可以在訪問成員時copy
(注:NSHashTable與NSSet的區(qū)別:NSHashTable可以通過option設(shè)置元素弱引用/copyin,只有可變類型。但是添加對象的時候NSHashTable耗費(fèi)時間是NSSet的兩倍。
NSMapTable與NSDictionary的區(qū)別:同上)
3、屬性關(guān)鍵字assign、retain、weak、copy
- assign:用于基本數(shù)據(jù)類型和結(jié)構(gòu)體。如果修飾對象的話,當(dāng)銷毀時,屬性值不會自動置nil,可能造成野指針。
- weak:對象引用計數(shù)為0時,屬性值也會自動置nil
- retain:強(qiáng)引用類型,ARC下相當(dāng)于strong,但block不能用retain修飾,因為等同于assign不安全。
- strong:強(qiáng)引用類型,修飾block時相當(dāng)于copy。
4、weak屬性如何自動置nil的?
- Runtime會對weak屬性進(jìn)行內(nèi)存布局,構(gòu)建hash表:以weak屬性對象內(nèi)存地址為key,weak屬性值(weak自身地址)為value。當(dāng)對象引用計數(shù)為0 dealloc時,會將weak屬性值自動置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)原理?手動觸發(fā)KVO?swift如何實(shí)現(xiàn)KVO?
- KVO原理:當(dāng)觀察一個對象時,runtime會動態(tài)創(chuàng)建繼承自該對象的類,并重寫被觀察對象的setter方法,重寫的setter方法會負(fù)責(zé)在調(diào)用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創(chuàng)建的子類,對象就變成子類的實(shí)例。
- 如何手動觸發(fā)KVO:在setter方法里,手動實(shí)現(xiàn)NSObject兩個方法:willChangeValueForKey、didChangeValueForKey
- swift的kvo:繼承自NSObject的類,或者直接willset/didset實(shí)現(xiàn)。
7、categroy為什么不能添加屬性?怎么實(shí)現(xiàn)添加?與Extension的區(qū)別?category覆蓋原類方法?多個category調(diào)用順序
- Runtime初始化時categroy的內(nèi)存布局已經(jīng)確定,沒有ivar,所以默認(rèn)不能添加屬性。
- 使用runtime的關(guān)聯(lián)對象,并重寫setter和getter方法。
- Extenstion編譯期創(chuàng)建,可以添加成員變量ivar,一般用作隱藏類的信息。必須要有類的源碼才可以添加,如NSString就不能創(chuàng)建Extension。
- category方法會在runtime初始化的時候copy到原來前面,調(diào)用分類方法的時候直接返回,不再調(diào)用原類。如何保持原類也調(diào)用(http://www.itdecent.cn/p/40e28c9f9da5)。
- 多個category的調(diào)用順序按照:Build Phases ->Complie Source 中的編譯順序。
8、load方法和initialize方法的異同?!饕f一下執(zhí)行時間,各自用途,沒實(shí)現(xiàn)子類的方法會不會調(diào)用父類的?
load initialize 調(diào)用時機(jī) app啟動后,runtime初始化的時候 第一個方法調(diào)用前調(diào)用 調(diào)用順序 父類->本類->分類 父類->本類(如果有分類直接調(diào)用分類,本類不會調(diào)用) 沒實(shí)現(xiàn)子類的方法會不會調(diào)用父類的 否 是 是否沿用父類實(shí)現(xiàn) 否 是

9、對 runtime 的理解?!饕欠椒ㄕ{(diào)用時如何查找緩存,如何找到方法,找不到方法時怎么轉(zhuǎn)發(fā),對象的內(nèi)存布局
OC中向?qū)ο蟀l(fā)送消息時,runtime會根據(jù)對象的isa指針找到對象所屬的類,然后在該類的方法列表和父類的方法列表中尋找方法執(zhí)行。如果在最頂層父類中沒找到方法執(zhí)行,就會進(jìn)行消息轉(zhuǎn)發(fā):Method resoution(實(shí)現(xiàn)方法)、fast forwarding(轉(zhuǎn)發(fā)給其他對象)、normal forwarding(完整消息轉(zhuǎn)發(fā)??梢赞D(zhuǎn)發(fā)給多個對象)
10、runtime 中,SEL和IMP的區(qū)別?
每個類對象都有一個方法列表,方法列表存儲方法名、方法實(shí)現(xiàn)、參數(shù)類型,SEL是方法名(編號),IMP指向方法實(shí)現(xiàn)的首地址
11、autoreleasepool的原理和使用場景?
- 若干個autoreleasepoolpage組成的雙向鏈表的棧結(jié)構(gòu),objc_autoreleasepoolpush、objc_autoreleasepoolpop、objc_autorelease
- 使用場景:多次創(chuàng)建臨時變量導(dǎo)致內(nèi)存上漲時,需要延遲釋放
-
autoreleasepoolpage的內(nèi)存結(jié)構(gòu):4k存儲大小
12、Autorelase對象什么時候釋放?
在沒有手加Autorelease Pool的情況下,Autorelease對象是在當(dāng)前的runloop迭代結(jié)束時釋放的,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop。
13、Runloop與線程的關(guān)系?Runloop的mode? Runloop的作用?內(nèi)部機(jī)制?
- 每一個線程都有一個runloop,主線程的runloop默認(rèn)啟動。
- mode:主要用來指定事件在運(yùn)行時循環(huán)的優(yōu)先級
- 作用:保持程序的持續(xù)運(yùn)行、隨時處理各種事件、節(jié)省cpu資源(沒事件休息釋放資源)、渲染屏幕UI
14、iOS中使用的鎖、死鎖的發(fā)生與避免
- @synchronized、信號量、NSLock等
- 死鎖:多個線程同時訪問同一資源,造成循環(huán)等待。GCD使用異步線程、并行隊列
15、NSOperation和GCD的區(qū)別
- GCD底層使用C語言編寫高效、NSOperation是對GCD的面向?qū)ο蟮姆庋b。對于特殊需求,如取消任務(wù)、設(shè)置任務(wù)優(yōu)先級、任務(wù)狀態(tài)監(jiān)聽,NSOperation使用起來更加方便。
- NSOperation可以設(shè)置依賴關(guān)系,而GCD只能通過dispatch_barrier_async實(shí)現(xiàn)
- NSOperation可以通過KVO觀察當(dāng)前operation執(zhí)行狀態(tài)(執(zhí)行/取消)
- NSOperation可以設(shè)置自身優(yōu)先級(queuePriority)。GCD只能設(shè)置隊列優(yōu)先級(DISPATCH_QUEUE_PRIORITY_DEFAULT),無法在執(zhí)行的block中設(shè)置優(yōu)先級
- NSOperation可以自定義operation如NSInvationOperation/NSBlockOperation,而GCD執(zhí)行任務(wù)可以自定義封裝但沒有那么高的代碼復(fù)用度
- 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關(guān)鍵字修飾
19、訪問控制關(guān)鍵字(public、open、private、filePrivate、internal)
- public與open:public在module內(nèi)部中,class和func都可以被訪問/重載/繼承,外部只能訪問;而open都可以
- private與filePrivate:private修飾class/func,表示只能在當(dāng)前class源文件/func內(nèi)部使用,外部不可以被繼承和訪問;而filePrivate表示只能在當(dāng)前swift源文件內(nèi)訪問
- internal:在整個模塊或者app內(nèi)都可以訪問,默認(rèn)訪問級別,可寫可不寫
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-b00115-1597130475632)]
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;沒有異常返回對應(yīng)的對象
- try!:直接告訴系統(tǒng),該方法沒有異常。如果出現(xiàn)異常程序會crash
24、@autoclosure:把一個表達(dá)式自動封裝成閉包
25、throws與rethrows:throws另一個throws時,將前者改為rethrows
26、App啟動優(yōu)化策略?main函數(shù)執(zhí)行前后怎么優(yōu)化
- 啟動時間 = pre-main耗時+main耗時
- pre-main階段優(yōu)化:
- 刪除無用代碼
- 抽象重復(fù)代碼
- +load方法做的事情延遲到initialize中,或者+load的事情不宜花費(fèi)太多時間
- 減少不必要的framework,或者優(yōu)化已有framework
- Main階段優(yōu)化
- didFinishLauchingwithOptions里代碼延后執(zhí)行
- 首次啟動渲染的頁面優(yōu)化
27、crash防護(hù)?
- 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 (機(jī)制待改善))
28、內(nèi)存泄露問題?
主要集中在循環(huán)引用問題中,如block、NSTime、perform selector引用計數(shù)問題。
29、UI卡頓優(yōu)化?
30、架構(gòu)&設(shè)計模式
- MVC設(shè)計模式介紹
- MVVM介紹、MVC與MVVM的區(qū)別?
- ReactiveCocoa的熱信號與冷信號
- 緩存架構(gòu)設(shè)計LRU方案
- SDWebImage源碼,如何實(shí)現(xiàn)解碼
- AFNetWorking源碼分析
- 組件化的實(shí)施,中間件的設(shè)計
- 哈希表的實(shí)現(xiàn)原理?如何解決沖突
31、數(shù)據(jù)結(jié)構(gòu)&算法
- 快速排序、歸并排序
- 二維數(shù)組查找(每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數(shù),輸入這樣的一個二維數(shù)組和一個整數(shù),判斷數(shù)組中是否含有該整數(shù))
- 二叉樹的遍歷:判斷二叉樹的層數(shù)
- 單鏈表判斷環(huán)
32、計算機(jī)基礎(chǔ)
- http與https?socket編程?tcp、udp?get與post?
- tcp三次握手與四次握手
- 進(jìn)程與線程的區(qū)別
其他技能入口
iOS App打包發(fā)布過程
iOS 底層探索之多線程系列文章
iOS App崩潰解析系列文章
更多內(nèi)容持續(xù)更新
?? 喜歡就點(diǎn)個贊吧????
?? 覺得有收獲的,可以來一波,收藏+關(guān)注,評論 + 轉(zhuǎn)發(fā),以免你下次找不到我????
??歡迎大家留言交流,批評指正,互相學(xué)習(xí)??,提升自我??
??作者郵件:zhangxmsy@163.com, 有問題聯(lián)系。

