iOS中級面試題一

什么是arc?(arc是為了解決什么問題誕生的?)

現(xiàn)在有不少程序員是直接從arc上手的,從沒接觸過mrc,對arc的理解僅僅停留在apple幫助管理內(nèi)存的層面。這個(gè)問題真正想了解的是對內(nèi)存管理的理解,retain release雖然不用寫了,但arc下還是會有內(nèi)存泄漏野指針crash的bug存在。如果能從retain count這種內(nèi)存管理策略的角度去闡述arc誕生的意義就算答對了。如果還能扯下其他類型的策略,比如java里的mark and sweep,那就加分點(diǎn)贊。

請解釋以下keywords的區(qū)別: assign vs weak, __block vs __weak

這道題屬于基礎(chǔ)語法題,可以網(wǎng)上搜到答案。不過真有不少同學(xué)不知道weak在對象釋放后會置為nil。__block關(guān)鍵字的理解稍微難點(diǎn),因?yàn)樵赼rc和mrc下含義(對retain count的影響)完全不同。理解了這幾個(gè)關(guān)鍵字就能應(yīng)付使用block時(shí)引入retain cycle的風(fēng)險(xiǎn)了。這題還在內(nèi)存管理的范疇之內(nèi)。

使用atomic一定是線程安全的嗎?

看這題的問法不用想答案肯定是NO。有些人說不出所以然,有些人知道通過property的方式使用才能保證安全,還有人知道這個(gè)用來做多線程安全會有性能損耗,更有出色的候選人能談atomic,synchronized,NSLock,pthread mutex,OSSpinLock的差別。 好奇寶寶點(diǎn)我

描述一個(gè)你遇到過的retain cycle例子。(別撒謊,你肯定遇到過)

說沒遇到過的我很難相信你有過成熟項(xiàng)目的經(jīng)歷。這題答不出了會扣很多很多分。用過block,寫過delegate的肯定都踩過坑。

+(void)load; +(void)initialize;有什么用處?

這題屬于runtime范疇,我遇到過能說出對runtime的理解卻不知道這兩個(gè)方法的候選人。所以答不出來也沒關(guān)系,這屬于細(xì)節(jié)知識點(diǎn),是加分項(xiàng),能答出兩個(gè)message各在什么階段接收就可以了。

為什么其他語言里叫函數(shù)調(diào)用, objective c里則是給對象發(fā)消息(或者談下對runtime的理解)

這題考查的是objective c這門語言的dynamic特性,需要對比c++這類傳統(tǒng)靜態(tài)方法調(diào)用才能理解。最好能說出一個(gè)對象收到message之后的完整的流程是如何的。對runtime有完整理解的候選人還能說出oc的對象模型。

什么是method swizzling?

說了解runtime但沒聽過method swizzling是騙人的。這題很容易搜到答案。定位一些疑難雜癥bug,hack老項(xiàng)目實(shí)現(xiàn),閱讀第三方源碼都有機(jī)會接觸到這個(gè)概念。

UIView和CALayer是啥關(guān)系?

能答出UIView是CALayer的delegate就及格了,能說出UIView主要處理事件,CALayer負(fù)責(zé)繪制就更好,再聊下二者在使用過程中對動畫流暢性影響的注意點(diǎn)就superb。UI流暢性是個(gè)大話題,推薦看下這兩篇文章。中餐,西餐。

如何高性能的給UIImageView加個(gè)圓角?(不準(zhǔn)說layer.cornerRadius!)

這題討論的最多,還有說美工切圖就搞定的。答主在項(xiàng)目里做過圓角頭像的處理,里面的坑還真不少。cornerRadius會導(dǎo)致offscreen drawing有性能問題,美工切圖無法適用有背景圖的場景,即使加上shouldRasterize也有cache實(shí)效問題。正確的做法是切換到工作線程利用CoreGraphic API生成一個(gè)offscreen UIImage,再切換到main thread賦值給UIImageView。這里還涉及到UIImageView復(fù)用,圓角頭像cache緩存(不能每次都去繪制),新舊頭像替換等等邏輯。還有其他的實(shí)現(xiàn)方式,但思路離不開工作線程與主線程切換。

使用drawRect有什么影響?(這個(gè)可深可淺,你至少得用過。。)

不少同學(xué)都用過drawRect或者看別人用過,但不知道這個(gè)api存在的含義。這不僅僅是另一種做UI的方式。drawRect會利用CPU生成offscreen bitmap,從而減輕GPU的繪制壓力,用這種方式最UI可以將動畫流暢性優(yōu)化到極致,但缺點(diǎn)是繪制api復(fù)雜,offscreen cache增加內(nèi)存開銷。UI動畫流暢性的優(yōu)化主要平衡CPU和GPU的工作壓力。推薦一篇文章:西餐

ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的?(把UIImageView放到UITableViewCell里面問更贊) 很多同學(xué)沒有讀源碼的習(xí)慣,別人的輪子拿來只是用用卻不知道真正的營養(yǎng)都在源代碼里面。這兩個(gè)經(jīng)典的framework代碼并不復(fù)雜,很值得一讀。能對一個(gè)UIImageView怎么通過url展示一張圖片有完整的理解。涉及到的知識點(diǎn)也非常多,UITableViewCell的復(fù)用,memory cache, disk cache, 多線程切換,甚至http協(xié)議本身都需要有一定的涉及。

麻煩你設(shè)計(jì)個(gè)簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)

內(nèi)存緩存是個(gè)通用話題,每個(gè)平臺都會涉及到。cache算法會影響到整個(gè)app的表現(xiàn)。候選人最好能談下自己都了解哪些cache策略及各自的特點(diǎn)。常見的有FIFO,LRU,LRU-2,2Q等等。由于NSCache的緩存策略不透明,一些app開發(fā)者會選擇自己做一套cache機(jī)制,其實(shí)并不難。

講講你用Instrument優(yōu)化動畫性能的經(jīng)歷吧(別問我什么是Instrument)

Apple的instrument為開發(fā)者提供了各種template去優(yōu)化app性能和定位問題。很多公司都在趕feature,并沒有充足的時(shí)間來做優(yōu)化,導(dǎo)致不少開發(fā)者對instrument不怎么熟悉。但這里面其實(shí)涵蓋了非常完整的計(jì)算機(jī)基礎(chǔ)理論知識體系,memory,disk,network,thread,cpu,gpu等等,順藤摸瓜去學(xué)習(xí),是一筆巨大的知識財(cái)富。動畫性能只是其中一個(gè)template,重點(diǎn)還是理解上面問題當(dāng)中CPU GPU如何配合工作的知識。

loadView是干嘛用的?

不要就簡單的告訴我沒用過,至少問下我有什么用。。這里是apple給開發(fā)者自己設(shè)置custom view的位置。說UI熟悉的一定要知道。

viewWillLayoutSubView你總是知道的。。

controller layout觸發(fā)的時(shí)候,開發(fā)者有機(jī)會去重新layout自己的各個(gè)subview。說UI熟悉的一定要知道。

GCD里面有哪幾種Queue?你自己建立過串行queue嗎?背后的線程模型是什么樣的?

兩種queue,串行和并行。main queue是串行,global queue是并行。有些開發(fā)者為了在工作線程串行的處理任務(wù)會自己建立一個(gè)serial queue。背后是蘋果維護(hù)的線程池,各種queue要用線程都是這個(gè)池子里取的。GCD大家都用過,但很多關(guān)鍵的概念不少人都理解的模凌兩可。串行,并行,同步,異步是GCD的核心概念。

用過coredata或者sqlite嗎?讀寫是分線程的嗎?遇到過死鎖沒?咋解決的?

沒用過sqlite是說不過去的。用過CoreData的肯定有很多血淚史要說。多謝線程模型你肯定做過比較選擇。死鎖是啥肯定也是要知道的,沒遇到過至少能舉個(gè)簡單的例子來說明。單個(gè)線程可以死鎖(main thread里dispatch_sync到main queue),多個(gè)線程直接也可以死鎖(A,B線程互相持有對方需要的資源且互相等待)。

http的post和get啥區(qū)別?(區(qū)別挺多的,麻煩多說點(diǎn))

這個(gè)可以說很多。不希望聽到的答案有

兩個(gè)差不多,隨便用一個(gè)。 post比get安全(其實(shí)兩個(gè)都不安全) 能說下兩個(gè)http格式有什么不同,各自應(yīng)用的場景就合格了。更多可以閱讀下這個(gè)答案。

我知道你大學(xué)畢業(yè)過后就沒接觸過算法數(shù)據(jù)結(jié)構(gòu)了,但是請你一定告訴我什么是Binary search tree? search的時(shí)間復(fù)雜度是多少?我很想知道! 很多人都很排斥數(shù)據(jù)結(jié)構(gòu)和算法題,我個(gè)人意見是復(fù)雜的可以不知道,基礎(chǔ)的一定要了解。時(shí)間復(fù)雜度是什么得知道,list,queue,stack,table,tree這些都要明白是啥。連hash表的概念都不知道怎么能保證在寫代碼的時(shí)候注意性能呢。

隱藏關(guān)卡?

其實(shí)當(dāng)初寫這份答案的時(shí)候并沒有準(zhǔn)備什么隱藏關(guān)卡,只不過有一些從自己這些年項(xiàng)目經(jīng)歷里總結(jié)出來的有深度的知識點(diǎn),感覺可以難倒不少同學(xué):p。求隱藏關(guān)卡的同學(xué)真不少,近期我會再準(zhǔn)備一份進(jìn)階版面試題,權(quán)當(dāng)作隱藏關(guān)卡。面向的對象是3~5年iOS開發(fā)經(jīng)驗(yàn)的同學(xué)。再次申明下:這只是一份面試題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考地址:MrPeak大神的中級面試題及針對Mrpeak面試題的解答 首先必須了解 iOS程序的啟動執(zhí)行順序 Ap...
    輕塵_小呂閱讀 390評論 0 1
  • 半年前在知乎瀏覽到一個(gè)帖子,是關(guān)于如何面試iOS工程師。由于當(dāng)時(shí)公司正在招聘iOS工程師,自己也面試了不少同學(xué),就...
    Crazy2015閱讀 1,299評論 0 15
  • 我的答案 我有過不少面試和被面試的經(jīng)歷,作為面試官出這份面試題從來就不是為了難倒面試者,而是為了多角度全面的了解面...
    北辰青閱讀 6,313評論 5 59
  • 什么是arc?(arc是為了解決什么問題誕生的?) 請解釋以下keywords的區(qū)別: assign vs wea...
    RobinYu閱讀 472評論 0 2
  • 一. 互聯(lián)網(wǎng)類 1. 互聯(lián)網(wǎng)市場觀察/新聞: (1)虎嗅網(wǎng) (2)艾瑞網(wǎng) (3)互聯(lián)網(wǎng)頭條 (4)互聯(lián)網(wǎng)扒皮王 (...
    haleyfang閱讀 341評論 0 0

友情鏈接更多精彩內(nèi)容