- 什么是arc约郁?(arc是為了解決什么問題誕生的?)
- 請解釋以下keywords的區(qū)別: assign vs weak, __block vs __weak
- __block在arc和非arc下含義一樣嗎?
- 使用atomic一定是線程安全的嗎?
- 描述一個(gè)你遇到過的retain cycle例子扫倡。(別撒謊,你肯定遇到過)
- +(void)load; +(void)initialize竟纳;有什么用處撵溃?
- 為什么其他語言里叫函數(shù)調(diào)用, objective c里則是給對象發(fā)消息(或者談下對runtime的理解)
- 什么是method swizzling?
- UIView和CALayer是啥關(guān)系锥累?
- 如何高性能的給UIImageView加個(gè)圓角缘挑?(不準(zhǔn)說layer.cornerRadius!)
- 使用drawRect有什么影響?(這個(gè)可深可淺桶略,你至少得用過语淘。。)
- ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的际歼?(把UIImageView放到UITableViewCell里面問更贊)
- 麻煩你設(shè)計(jì)個(gè)簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)
- 講講你用Instrument優(yōu)化動(dòng)畫性能的經(jīng)歷吧(別問我什么是Instrument)
- loadView是干嘛用的惶翻?
- viewWillLayoutSubView你總是知道的。蹬挺。
- GCD里面有哪幾種Queue维贺?你自己建立過串行queue嗎?背后的線程模型是什么樣的巴帮?
- 用過coredata或者sqlite嗎溯泣?讀寫是分線程的嗎?遇到過死鎖沒榕茧?咋解決的垃沦?
- http的post和get啥區(qū)別?(區(qū)別挺多的用押,麻煩多說點(diǎn))
- 我知道你大學(xué)畢業(yè)過后就沒接觸過算法數(shù)據(jù)結(jié)構(gòu)了肢簿,但是請你一定告訴我什么是Binary search tree? search的時(shí)間復(fù)雜度是多少?我很想知道!
我的答案
我有過不少面試和被面試的經(jīng)歷池充,作為面試官出這份面試題從來就不是為了難倒面試者桩引,而是為了多角度全面的了解面試者從而建立信任。面試的時(shí)候最擔(dān)心的是冷場收夸,面試題只不過個(gè)引子坑匠,我心底里最希望遇到的面試者是能夠舉一反三,除了回答問題本身之外卧惜,還能自信的旁征博引厘灼,深談其背后原理或者相關(guān)的知識(shí)理論的。問題本身反而并不怎么重要咽瓷。這份清單里的問題也并不難设凹,這里我列下我的回答以及從我的角度所期望的答案。
什么是arc茅姜?(arc是為了解決什么問題誕生的闪朱?)
現(xiàn)在有不少程序員是直接從arc上手的,從沒接觸過mrc匈睁,對arc的理解僅僅停留在apple幫助管理內(nèi)存的層面监透。這個(gè)問題真正想了解的是對內(nèi)存管理的理解,retain release雖然不用寫了航唆,但arc下還是會(huì)有內(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在對象釋放后會(huì)置為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è)用來做多線程安全會(huì)有性能損耗,更有出色的候選人能談atomic,synchronized,NSLock,pthread mutex,OSSpinLock的差別猜敢。好奇寶寶點(diǎn)我姑荷。
描述一個(gè)你遇到過的retain cycle例子盒延。(別撒謊,你肯定遇到過)
說沒遇到過的我很難相信你有過成熟項(xiàng)目的經(jīng)歷鼠冕。這題答不出了會(huì)扣很多很多分添寺。用過block,寫過delegate的肯定都踩過坑供鸠。
+(void)load; +(void)initialize畦贸;有什么用處?
這題屬于runtime范疇楞捂,我遇到過能說出對runtime的理解卻不知道這兩個(gè)方法的候選人。所以答不出來也沒關(guān)系趋厉,這屬于細(xì)節(jié)知識(shí)點(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ī)會(huì)接觸到這個(gè)概念东且。
UIView和CALayer是啥關(guān)系?
能答出UIView是CALayer的delegate就及格了,能說出UIView主要處理事件金度,CALayer負(fù)責(zé)繪制就更好应媚,再聊下二者在使用過程中對動(dòng)畫流暢性影響的注意點(diǎn)就superb。UI流暢性是個(gè)大話題猜极,推薦看下這兩篇文章中姜。中餐,西餐跟伏。
如何高性能的給UIImageView加個(gè)圓角丢胚?(不準(zhǔn)說layer.cornerRadius!)
這題討論的最多,還有說美工切圖就搞定的酬姆。答主在項(xiàng)目里做過圓角頭像的處理嗜桌,里面的坑還真不少。cornerRadius會(huì)導(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會(huì)利用CPU生成offscreen bitmap鸟妙,從而減輕GPU的繪制壓力,用這種方式最UI可以將動(dòng)畫流暢性優(yōu)化到極致挥吵,但缺點(diǎn)是繪制api復(fù)雜重父,offscreen cache增加內(nèi)存開銷。UI動(dòng)畫流暢性的優(yōu)化主要平衡CPU和GPU的工作壓力忽匈。推薦一篇文章:西餐
ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的房午?(把UIImageView放到UITableViewCell里面問更贊)
很多同學(xué)沒有讀源碼的習(xí)慣,別人的輪子拿來只是用用卻不知道真正的營養(yǎng)都在源代碼里面脉幢。這兩個(gè)經(jīng)典的framework代碼并不復(fù)雜歪沃,很值得一讀。能對一個(gè)UIImageView怎么通過url展示一張圖片有完整的理解嫌松。涉及到的知識(shí)點(diǎn)也非常多沪曙,UITableViewCell的復(fù)用,memory cache, disk cache, 多線程切換萎羔,甚至http協(xié)議本身都需要有一定的涉及液走。
麻煩你設(shè)計(jì)個(gè)簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)
內(nèi)存緩存是個(gè)通用話題,每個(gè)平臺(tái)都會(huì)涉及到贾陷。cache算法會(huì)影響到整個(gè)app的表現(xiàn)缘眶。候選人最好能談下自己都了解哪些cache策略及各自的特點(diǎn)。常見的有FIFO,LRU,LRU-2,2Q等等髓废。由于NSCache的緩存策略不透明巷懈,一些app開發(fā)者會(huì)選擇自己做一套cache機(jī)制,其實(shí)并不難慌洪。
講講你用Instrument優(yōu)化動(dòng)畫性能的經(jīng)歷吧(別問我什么是Instrument)
Apple的instrument為開發(fā)者提供了各種template去優(yōu)化app性能和定位問題顶燕。很多公司都在趕feature凑保,并沒有充足的時(shí)間來做優(yōu)化,導(dǎo)致不少開發(fā)者對instrument不怎么熟悉涌攻。但這里面其實(shí)涵蓋了非常完整的計(jì)算機(jī)基礎(chǔ)理論知識(shí)體系欧引,memory,disk恳谎,network芝此,thread,cpu因痛,gpu等等婚苹,順藤摸瓜去學(xué)習(xí),是一筆巨大的知識(shí)財(cái)富鸵膏。動(dòng)畫性能只是其中一個(gè)template租副,重點(diǎn)還是理解上面問題當(dāng)中CPU GPU如何配合工作的知識(shí)。
loadView是干嘛用的较性?
不要就簡單的告訴我沒用過,至少問下我有什么用结胀。赞咙。這里是apple給開發(fā)者自己設(shè)置custom view的位置。說UI熟悉的一定要知道糟港。
viewWillLayoutSubView你總是知道的攀操。。
controller layout觸發(fā)的時(shí)候秸抚,開發(fā)者有機(jī)會(huì)去重新layout自己的各個(gè)subview速和。說UI熟悉的一定要知道。
GCD里面有哪幾種Queue剥汤?你自己建立過串行queue嗎颠放?背后的線程模型是什么樣的?
兩種queue吭敢,串行和并行碰凶。main queue是串行,global queue是并行鹿驼。有些開發(fā)者為了在工作線程串行的處理任務(wù)會(huì)自己建立一個(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í)候注意性能呢。
https://www.zhihu.com/question/19604641
http://blog.csdn.net/hanangellove/article/details/45033453 (參考答案)