這篇文章主要介紹“高級(jí)iOS面試題有哪些”,在日常操作中,相信很多人在高級(jí)iOS面試題有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”高級(jí)iOS面試題有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站IDC提供業(yè)務(wù):雅安移動(dòng)機(jī)房,成都服務(wù)器租用,雅安移動(dòng)機(jī)房,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動(dòng)機(jī)房,聯(lián)通機(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ì)元素弱引用,可變類(lèi)型;可以在訪問(wèn)成員時(shí)copy
NSMapTable是NSDictionary的通用版本,對(duì)元素弱引用,可變類(lèi)型;可以在訪問(wèn)成員時(shí)copy
(注:NSHashTable與NSSet的區(qū)別:NSHashTable可以通過(guò)option設(shè)置元素弱引用/copyin,只有可變類(lèi)型。但是添加對(duì)象的時(shí)候NSHashTable耗費(fèi)時(shí)間是NSSet的兩倍。
NSMapTable與NSDictionary的區(qū)別:同上)
3、屬性關(guān)鍵字assign、retain、weak、copy
assign:用于基本數(shù)據(jù)類(lèi)型和結(jié)構(gòu)體。如果修飾對(duì)象的話,當(dāng)銷(xiāo)毀時(shí),屬性值不會(huì)自動(dòng)置nil,可能造成野指針。
weak:對(duì)象引用計(jì)數(shù)為0時(shí),屬性值也會(huì)自動(dòng)置nil
retain:強(qiáng)引用類(lèi)型,ARC下相當(dāng)于strong,但block不能用retain修飾,因?yàn)榈韧赼ssign不安全。
strong:強(qiáng)引用類(lèi)型,修飾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ì)象的類(lèi),并重寫(xiě)被觀察對(duì)象的setter方法,重寫(xiě)的setter方法會(huì)負(fù)責(zé)在調(diào)用原setter方法前后通知所有觀察對(duì)象值得更改,最后會(huì)把該對(duì)象的isa指針指向這個(gè)創(chuàng)建的子類(lèi),對(duì)象就變成子類(lèi)的實(shí)例。
如何手動(dòng)觸發(fā)KVO:在setter方法里,手動(dòng)實(shí)現(xiàn)NSObject兩個(gè)方法:willChangeValueForKey、didChangeValueForKey
swift的kvo:繼承自NSObject的類(lèi),或者直接willset/didset實(shí)現(xiàn)。
7、categroy為什么不能添加屬性?怎么實(shí)現(xiàn)添加?與Extension的區(qū)別?category覆蓋原類(lèi)方法?多個(gè)category調(diào)用順序
Runtime初始化時(shí)categroy的內(nèi)存布局已經(jīng)確定,沒(méi)有ivar,所以默認(rèn)不能添加屬性。
使用runtime的關(guān)聯(lián)對(duì)象,并重寫(xiě)setter和getter方法。
Extenstion編譯期創(chuàng)建,可以添加成員變量ivar,一般用作隱藏類(lèi)的信息。必須要有類(lèi)的源碼才可以添加,如NSString就不能創(chuàng)建Extension。
category方法會(huì)在runtime初始化的時(shí)候copy到原來(lái)前面,調(diào)用分類(lèi)方法的時(shí)候直接返回,不再調(diào)用原類(lèi)。如何保持原類(lèi)也調(diào)用( https://www.jianshu.com/p/40e28c9f9da5)。
多個(gè)category的調(diào)用順序按照:Build Phases ->Complie Source 中的編譯順序。
8、load方法和initialize方法的異同?!饕f(shuō)一下執(zhí)行時(shí)間,各自用途,沒(méi)實(shí)現(xiàn)子類(lèi)的方法會(huì)不會(huì)調(diào)用父類(lèi)的?
load initialize 調(diào)用時(shí)機(jī) app啟動(dòng)后,runtime初始化的時(shí)候 第一個(gè)方法調(diào)用前調(diào)用 調(diào)用順序 父類(lèi)->本類(lèi)->分類(lèi) 父類(lèi)->本類(lèi)(如果有分類(lèi)直接調(diào)用分類(lèi),本類(lèi)不會(huì)調(diào)用) 沒(méi)實(shí)現(xiàn)子類(lèi)的方法會(huì)不會(huì)調(diào)用父類(lèi)的 否 是 是否沿用父類(lèi)實(shí)現(xiàn) 否 是
image
9、對(duì) runtime 的理解?!饕欠椒ㄕ{(diào)用時(shí)如何查找緩存,如何找到方法,找不到方法時(shí)怎么轉(zhuǎn)發(fā),對(duì)象的內(nèi)存布局
OC中向?qū)ο蟀l(fā)送消息時(shí),runtime會(huì)根據(jù)對(duì)象的isa指針找到對(duì)象所屬的類(lèi),然后在該類(lèi)的方法列表和父類(lèi)的方法列表中尋找方法執(zhí)行。如果在最頂層父類(lèi)中沒(méi)找到方法執(zhí)行,就會(huì)進(jìn)行消息轉(zhuǎn)發(fā):Method resoution(實(shí)現(xiàn)方法)、fast forwarding(轉(zhuǎn)發(fā)給其他對(duì)象)、normal forwarding(完整消息轉(zhuǎn)發(fā)??梢赞D(zhuǎn)發(fā)給多個(gè)對(duì)象)
10、runtime 中,SEL和IMP的區(qū)別?
每個(gè)類(lèi)對(duì)象都有一個(gè)方法列表,方法列表存儲(chǔ)方法名、方法實(shí)現(xiàn)、參數(shù)類(lèi)型,SEL是方法名(編號(hào)),IMP指向方法實(shí)現(xiàn)的首地址
11、autoreleasepool的原理和使用場(chǎng)景?
若干個(gè)autoreleasepoolpage組成的雙向鏈表的棧結(jié)構(gòu),objc_autoreleasepoolpush、objc_autoreleasepoolpop、objc_autorelease
使用場(chǎng)景:多次創(chuàng)建臨時(shí)變量導(dǎo)致內(nèi)存上漲時(shí),需要延遲釋放
autoreleasepoolpage的內(nèi)存結(jié)構(gòu):4k存儲(chǔ)大小
image
12、Autorelase對(duì)象什么時(shí)候釋放?
在沒(méi)有手加Autorelease Pool的情況下,Autorelease對(duì)象是在當(dāng)前的runloop迭代結(jié)束時(shí)釋放的,而它能夠釋放的原因是系統(tǒng)在每個(gè)runloop迭代中都加入了自動(dòng)釋放池Push和Pop。
13、Runloop與線程的關(guān)系?Runloop的mode? Runloop的作用??jī)?nèi)部機(jī)制?
每一個(gè)線程都有一個(gè)runloop,主線程的runloop默認(rèn)啟動(dòng)。
mode:主要用來(lái)指定事件在運(yùn)行時(shí)循環(huán)的優(yōu)先級(jí)
作用:保持程序的持續(xù)運(yùn)行、隨時(shí)處理各種事件、節(jié)省cpu資源(沒(méi)事件休息釋放資源)、渲染屏幕UI
14、iOS中使用的鎖、死鎖的發(fā)生與避免
@synchronized、信號(hào)量、NSLock等
死鎖:多個(gè)線程同時(shí)訪問(wèn)同一資源,造成循環(huán)等待。GCD使用異步線程、并行隊(duì)列
15、NSOperation和GCD的區(qū)別
GCD底層使用C語(yǔ)言編寫(xiě)高效、NSOperation是對(duì)GCD的面向?qū)ο蟮姆庋b。對(duì)于特殊需求,如取消任務(wù)、設(shè)置任務(wù)優(yōu)先級(jí)、任務(wù)狀態(tài)監(jiān)聽(tīng),NSOperation使用起來(lái)更加方便。
NSOperation可以設(shè)置依賴(lài)關(guān)系,而GCD只能通過(guò)dispatch_barrier_async實(shí)現(xiàn)
NSOperation可以通過(guò)KVO觀察當(dāng)前operation執(zhí)行狀態(tài)(執(zhí)行/取消)
NSOperation可以設(shè)置自身優(yōu)先級(jí)(queuePriority)。GCD只能設(shè)置隊(duì)列優(yōu)先級(jí)(DISPATCH_QUEUE_PRIORITY_DEFAULT),無(wú)法在執(zhí)行的block中設(shè)置優(yōu)先級(jí)
NSOperation可以自定義operation如NSInvationOperation/NSBlockOperation,而GCD執(zhí)行任務(wù)可以自定義封裝但沒(méi)有那么高的代碼復(fù)用度
GCD高效,NSOperation開(kāi)銷(xiāo)相對(duì)高
16、oc與js交互
攔截url
JavaScriptCore(只適用于UIWebView)
WKScriptMessageHandler(只適用于WKWebView)
WebViewJavaScriptBridge(第三方框架)
17、swift相比OC有什么優(yōu)勢(shì)?
18、struct、Class的區(qū)別
class可以繼承,struct不可以
class是引用類(lèi)型,struct是值類(lèi)型
struct在function里修改property時(shí)需要mutating關(guān)鍵字修飾
19、訪問(wèn)控制關(guān)鍵字(public、open、private、filePrivate、internal)
public與open:public在module內(nèi)部中,class和func都可以被訪問(wèn)/重載/繼承,外部只能訪問(wèn);而open都可以
private與filePrivate:private修飾class/func,表示只能在當(dāng)前class源文件/func內(nèi)部使用,外部不可以被繼承和訪問(wèn);而filePrivate表示只能在當(dāng)前swift源文件內(nèi)訪問(wèn)
internal:在整個(gè)模塊或者app內(nèi)都可以訪問(wèn),默認(rèn)訪問(wèn)級(jí)別,可寫(xiě)可不寫(xiě)
20、OC與Swift混編
OC調(diào)用swift:import "工程名-swift.h” @objc
swift調(diào)用oc:橋接文件
21、map、filter、reduce?map與flapmap的區(qū)別?
map:數(shù)組中每個(gè)元素都經(jīng)過(guò)某個(gè)方法轉(zhuǎn)換,最后返回新的數(shù)組(xx.map({0}))
flatmap:同map類(lèi)似,區(qū)別在flatmap返回的數(shù)組不存在nil,并且會(huì)把optional解包;而且還可以把嵌套的數(shù)組打開(kāi)變成一個(gè)([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6])
filter:用戶篩選元素(xxx.filter({$0 > 25}),篩選出大于25的元素組成新數(shù)組)
reduce:把數(shù)組元素組合計(jì)算為一個(gè)值,并接收初始值()
image
22、guard與defer
guard用于提前處理錯(cuò)誤數(shù)據(jù),else退出程序,提高代碼可讀性
defer延遲執(zhí)行,回收資源。多個(gè)defer反序執(zhí)行,嵌套defer先執(zhí)行外層,后執(zhí)行內(nèi)層
23、try、try?與try!
try:手動(dòng)捕捉異常
try?:系統(tǒng)幫我們處理,出現(xiàn)異常返回nil;沒(méi)有異常返回對(duì)應(yīng)的對(duì)象
try!:直接告訴系統(tǒng),該方法沒(méi)有異常。如果出現(xiàn)異常程序會(huì)crash
24、@autoclosure:把一個(gè)表達(dá)式自動(dòng)封裝成閉包
25、throws與rethrows:throws另一個(gè)throws時(shí),將前者改為rethrows
26、App啟動(dòng)優(yōu)化策略?main函數(shù)執(zhí)行前后怎么優(yōu)化
啟動(dòng)時(shí)間 = pre-main耗時(shí)+main耗時(shí)
pre-main階段優(yōu)化:
刪除無(wú)用代碼
抽象重復(fù)代碼
+load方法做的事情延遲到initialize中,或者+load的事情不宜花費(fèi)太多時(shí)間
減少不必要的framework,或者優(yōu)化已有framework
Main階段優(yōu)化
didFinishLauchingwithOptions里代碼延后執(zhí)行
首次啟動(dòng)渲染的頁(yè)面優(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)存泄露問(wèn)題?
主要集中在循環(huán)引用問(wèn)題中,如block、NSTime、perform selector引用計(jì)數(shù)問(wèn)題。
29、UI卡頓優(yōu)化?
30、架構(gòu)&設(shè)計(jì)模式
MVC設(shè)計(jì)模式介紹
MVVM介紹、MVC與MVVM的區(qū)別?
ReactiveCocoa的熱信號(hào)與冷信號(hào)
緩存架構(gòu)設(shè)計(jì)LRU方案
SDWebImage源碼,如何實(shí)現(xiàn)解碼
AFNetWorking源碼分析
組件化的實(shí)施,中間件的設(shè)計(jì)
哈希表的實(shí)現(xiàn)原理?如何解決沖突
31、數(shù)據(jù)結(jié)構(gòu)&算法
快速排序、歸并排序
二維數(shù)組查找(每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù))
二叉樹(shù)的遍歷:判斷二叉樹(shù)的層數(shù)
單鏈表判斷環(huán)
32、計(jì)算機(jī)基礎(chǔ)
http與https?socket編程?tcp、udp?get與post?
tcp三次握手與四次握手
進(jìn)程與線程的區(qū)別
到此,關(guān)于“高級(jí)iOS面試題有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
網(wǎng)站標(biāo)題:高級(jí)iOS面試題有哪些-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://aaarwkj.com/article8/dpioip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容