整理出一份高級(jí)iOS面試題

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)用(http://www.reibang.com/p/40e28c9f9da5

8芙委、load方法和initialize方法的異同】袂兀——主要說(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) 否 是

433fec36ea252eb9450e807a53ad25f5.jpg

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ā)〕ィ可以轉(zhuǎn)發(fā)給多個(gè)對(duì)象)

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

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

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ǔ)

  1. http與https拜英?socket編程静汤?tcp、udp聊记?get與post撒妈?
  2. tcp三次握手與四次握手
  3. 進(jìn)程與線程的區(qū)別

作者:馬拉薩的春天
來(lái)源:CSDN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市排监,隨后出現(xiàn)的幾起案子狰右,更是在濱河造成了極大的恐慌,老刑警劉巖舆床,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棋蚌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挨队,警方通過(guò)查閱死者的電腦和手機(jī)谷暮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盛垦,“玉大人湿弦,你說(shuō)我怎么就攤上這事√诤唬” “怎么了颊埃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蝶俱。 經(jīng)常有香客問(wèn)我班利,道長(zhǎng),這世上最難降的妖魔是什么榨呆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任罗标,我火速辦了婚禮,結(jié)果婚禮上积蜻,老公的妹妹穿的比我還像新娘闯割。我一直安慰自己,他們只是感情好竿拆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布宙拉。 她就那樣靜靜地躺著,像睡著了一般如输。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天不见,我揣著相機(jī)與錄音澳化,去河邊找鬼。 笑死稳吮,一個(gè)胖子當(dāng)著我的面吹牛缎谷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灶似,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼列林,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酪惭?” 一聲冷哼從身側(cè)響起希痴,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎春感,沒(méi)想到半個(gè)月后砌创,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲫懒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嫩实,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窥岩。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甲献,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颂翼,到底是詐尸還是另有隱情晃洒,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布疚鲤,位于F島的核電站锥累,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏集歇。R本人自食惡果不足惜桶略,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诲宇。 院中可真熱鬧际歼,春花似錦、人聲如沸姑蓝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纺荧。三九已至旭愧,卻和暖如春颅筋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背输枯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工议泵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桃熄。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓先口,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瞳收。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碉京,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容