試答知乎“面試iOS程序員的問(wèn)題列表”




更完善的解答


1. 什么是arc乡摹?(arc是為了解決什么問(wèn)題誕生的役耕?)

Auto Reference Counting,自動(dòng)引用計(jì)數(shù)聪廉。

我猜是為了解決MRC下反復(fù)retain 和 release 很麻煩

能夠降低程序崩潰和內(nèi)存泄露的風(fēng)險(xiǎn), 而且可以減少開發(fā)者的工作量, 能夠大幅度提升程序的流暢性可預(yù)測(cè)性

能加快運(yùn)行速度速度瞬痘。

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


assign 是給非OC對(duì)象類型用的,比如BOOL啊锄列,Integer啊图云,CGFloat之類的。

對(duì)于OC對(duì)象相似的是unsafe_unretain.

weak 是會(huì)把被引用的對(duì)象設(shè)為nil的邻邮。unsafe_unretain不會(huì)竣况。

assign用于簡(jiǎn)單的賦值, 不改變屬性的引用計(jì)數(shù), 用于 Objective-C 中的NSInteger,CGFloat以及 C 語(yǔ)言中int,float,double等數(shù)據(jù)類型.

weak用于對(duì)象類型, 由于weak同樣不改變對(duì)象的引用計(jì)數(shù)且不持有對(duì)象實(shí)例, 當(dāng)該對(duì)象廢棄時(shí), 該弱引用自動(dòng)失效并且被賦值為nil, 所以它可以用于避免兩個(gè)強(qiáng)引用產(chǎn)生的循環(huán)引用導(dǎo)致內(nèi)存無(wú)法釋放的問(wèn)題.

strong會(huì)retain新值,release舊值筒严。

如果要在接下來(lái)的block里要set某個(gè)對(duì)象丹泉,就需要用__block,block 中只具有"使用權(quán)"而不具有"修改權(quán)". 而__block說(shuō)明符就為 block 提供了變量的修改權(quán).

如果要在接下來(lái)的block里解決循環(huán)強(qiáng)引用鸭蛙,就需要用__weak

3. __block在arc和非arc下含義一樣嗎摹恨?

印象中不一樣。非ARC是怎樣的呢娶视,(沒(méi)寫過(guò)ARC所以沒(méi)印象)回頭翻翻書晒哄。

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

不是肪获,atomic只是在setter方法里加了@synchrosized而已寝凌。

如果A獲取某個(gè)值,BCD正在修改這個(gè)值孝赫,atomic只能保證A能獲取到一個(gè)值不至于autorelease较木,但是并不能保證獲取到哪個(gè)。


如果要更好的線程安全可以用GCD來(lái)實(shí)現(xiàn)青柄。同步隊(duì)列和柵欄快伐债。


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

class A{

? ?var b = B()?

? ?func fooooooo(){
? ? ? ? b.block = {() ->Void

? ? ? ? ? ? ? ? self.... = ....

? ? ? ? }

? ?}

}

class B{

? ? var block:(()->Void)?

}

例子二:NSTimer

例子三:delegate

6. +(void)load; +(void)initialize峰锁;有什么用處萎馅?

? ? ?前者是在所有的類初始化時(shí)加載的,前者一般情況下用不著虹蒋,會(huì)block住

? ? ?后者在類自己執(zhí)行一些初始化方法時(shí)加載校坑,可以用來(lái)執(zhí)行一些早期的快速簡(jiǎn)單的初始化,不應(yīng)該用來(lái)做復(fù)雜的初始化千诬。

當(dāng)類對(duì)象被引入項(xiàng)目時(shí), runtime 會(huì)向每一個(gè)類對(duì)象發(fā)送load消息.load方法還是非常的神奇的, 因?yàn)樗鼤?huì)在每一個(gè)類甚至分類被引入時(shí)僅調(diào)用一次, 調(diào)用的順序是父類優(yōu)先于子類, 子類優(yōu)先于分類. 而且load方法不會(huì)被類自動(dòng)繼承, 每一個(gè)類中的load方法都不需要像viewDidLoad方法一樣調(diào)用父類的方法. 由于load方法會(huì)在類被import時(shí)調(diào)用一次, 而這時(shí)往往是改變類的行為的最佳時(shí)機(jī). 我在DKNightVersion中使用method swizlling來(lái)修改原有的方法時(shí), 就是在分類load中實(shí)現(xiàn)的.

initialize方法和load方法有一些不同, 它雖然也會(huì)在整個(gè) runtime 過(guò)程中調(diào)用一次, 但是它是在該類的第一個(gè)方法執(zhí)行之前調(diào)用, 也就是說(shuō)initialize的調(diào)用是惰性的, 它的實(shí)現(xiàn)也與我們?cè)谄綍r(shí)使用的惰性初始化屬性時(shí)基本相同. 我在實(shí)際的項(xiàng)目中并沒(méi)有遇到過(guò)必須使用這個(gè)方法的情況, 在該方法中主要做靜態(tài)變量的設(shè)置并用于確保在實(shí)例初始化前某些條件必須滿足.

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

? ? ?OC是運(yùn)行時(shí)語(yǔ)言, ?不像某些在編譯期就把需要執(zhí)行的函數(shù)準(zhǔn)備好膏斤,OC是在運(yùn)行時(shí)才會(huì)讓某個(gè)對(duì)象執(zhí)行某個(gè)方法徐绑。 ?這樣的優(yōu)點(diǎn)是較為靈活。以及...?


所有的消息都會(huì)在運(yùn)行時(shí)才會(huì)確定,[obj message]在運(yùn)行時(shí)會(huì)被轉(zhuǎn)化為objc_msgSend(id self, SEL cmd, ...)來(lái)執(zhí)行, 它會(huì)在運(yùn)行時(shí)從選擇子表中尋找對(duì)應(yīng)的選擇子并將選擇子與實(shí)現(xiàn)進(jìn)行綁定. 而如果沒(méi)有找到對(duì)應(yīng)的實(shí)現(xiàn), 就會(huì)進(jìn)入類似黑魔法的消息轉(zhuǎn)發(fā)流程. 調(diào)用+ (BOOL)resolveInstanceMethod:(SEL)aSelector方法, 我們可以在這個(gè)方法中為類動(dòng)態(tài)地生成方法.

我們幾乎可以使用 runtime 改 Objective-C 中的一切:classpropertyobjectivarmethodprotocol, 而下面就是它的主要應(yīng)用:

內(nèi)省

為分類動(dòng)態(tài)的添加屬性

使用方法調(diào)劑修改原有的方法實(shí)現(xiàn)

...

8. 什么是method swizzling?

? ?中文名叫方法調(diào)配莫辨。傲茄。就是把 某個(gè) 類的 兩個(gè)方法 在運(yùn)行時(shí)執(zhí)行的內(nèi)容調(diào)換過(guò)來(lái)。

? 可以用來(lái)修改或者debug一些系統(tǒng)自帶方法沮榜。方法的調(diào)用時(shí)機(jī)就是在上面提到的load方法中, 不在initialize方法中改變方法實(shí)現(xiàn)的原因是initialize可能會(huì)被子類所繼承并重新執(zhí)行最終導(dǎo)致無(wú)限遞歸, 而load并不會(huì)被繼承.

9. UIView和CALayer是啥關(guān)系盘榨?

? ? UIView 有一個(gè)layer 屬性是CALayer。CALayer主要用來(lái)顯示圖層蟆融。UIView 可以理解為用來(lái)顯示圖層的layer和用來(lái)響應(yīng)手勢(shì)操作的部分草巡。

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

? ? ? ? 用CGPath型酥。 ?跟陰影同理山憨,等我去找找具體實(shí)現(xiàn)的資料。

11. 使用drawRect有什么影響弥喉?(這個(gè)可深可淺郁竟,你至少得用過(guò)。由境。)

? ? ? ?drawRect是UIView的繪制方法棚亩,可以進(jìn)行一些繪制工作。

? ? ? ?盡量少在這里做復(fù)雜的繪制虏杰。

? ? ? ?UIView.setNeedsDisplay() 會(huì)調(diào)用這個(gè)方法重新繪制

12. ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的讥蟆?(把UIImageView放到UITableViewCell里面問(wèn)更贊)

? ? ? ?會(huì)用URL作為key把圖片緩存起來(lái)。先用這個(gè)key在緩存中查找嘹屯,如果有則加載攻询,如果沒(méi)有則開始下載。下載完成后緩存圖片并重載州弟。

? ? ?具體待我查查...

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

? ? ? 寫一個(gè)FIFO的存儲(chǔ)機(jī)制钧栖,設(shè)置一定量的內(nèi)存大小低零。每次添加新的圖片后檢查是否超出容量,如果超出則釋放隊(duì)列最前面的圖片拯杠。

? ? ?具體待我查查...

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

? ? ? Core Graphics 可以查看幀數(shù)... ? 像collectionview掏婶,tableview,mapview這樣高速拖動(dòng)的時(shí)候幀數(shù)50~60多是不錯(cuò)的...40多就略卡需要優(yōu)化了...?

? ? ? 優(yōu)化的話潭陪,基礎(chǔ)的的雄妥,reuse大家都知道,然后把opaque都設(shè)置為false(有個(gè)選項(xiàng)可以顯示那些為true的UIView)依溯,然后把cornerRadius和shadow(主要是shadow)優(yōu)化老厌,不要用代碼寫。然后不要在delegate方法里使用類似 tableview.cellForIndexpath 還是 indexpathForCell 類似的方法 黎炉。

? ? ?要求高一點(diǎn)枝秤,就盡可能緩存和預(yù)加載。而且不在delegate里減少需要計(jì)算的東西慷嗜,和占內(nèi)存的東西淀弹。VVebo有一個(gè)極致優(yōu)化tableView的例子,是在后臺(tái)進(jìn)程先把layer的image繪制好庆械,然后緩存起來(lái)要顯示的時(shí)候再加載薇溃。? ? ??

? ? 我做過(guò)一個(gè)mapView的優(yōu)化,需要在地圖上顯示幾千個(gè)marker缭乘,最后采用分層顯示沐序,和構(gòu)建一個(gè)緩存庫(kù)動(dòng)態(tài)增加/減少的方法。

15. loadView是干嘛用的忿峻?

loadView是UIViewController的實(shí)例方法, 我們永遠(yuǎn)不要直接調(diào)用這個(gè)方法[self loadView]. 這在蘋果的官方文檔中已經(jīng)明確的寫出了.loadView會(huì)在獲取視圖控制器的view但是卻得到nil時(shí)被調(diào)用.

loadView的具體實(shí)現(xiàn)會(huì)做下面兩件事情中的一件:

如果你的視圖控制器關(guān)聯(lián)了一個(gè) storyboard, 那么它就會(huì)加載 storyboard 中的視圖.

如果試圖控制器沒(méi)有關(guān)聯(lián)的 storyboard, 那么就會(huì)創(chuàng)建一個(gè)空的視圖, 并分配給view屬性

如果你需要覆寫loadView方法:

你需要?jiǎng)?chuàng)建一個(gè)根視圖.

創(chuàng)建并初始化view的子視圖, 調(diào)用addSubview:方法將它們添加到父視圖上.

如果你使用了自動(dòng)布局, 提供足夠的約束來(lái)保證視圖的位置.

將根視圖分配給view屬性.

永遠(yuǎn)不要在這個(gè)方法中調(diào)用[super loadView].

16. viewWillLayoutSubView你總是知道的薄啥。。

? ? ? viewwilllayoutsubviews(UIViewController) -> layoutsubviews(UIView) -> viewDidlayoutsubviews(UIViewController)

? ? ?主要用來(lái)修改一些布局逛尚,位置

17. GCD里面有哪幾種Queue垄惧?你自己建立過(guò)串行queue嗎?背后的線程模型是什么樣的绰寞?

? ? ? ?main_queue ? global_queue ? 以及單個(gè)queue到逊。

線程模型?不知道滤钱,去查查觉壶。

Serial Dispatch Queue ? ? ?

Concurrent Dispatch Queue

18. 用過(guò)coredata或者sqlite嗎?讀寫是分線程的嗎件缸?遇到過(guò)死鎖沒(méi)铜靶?咋解決的?

? ? ? ? CoreData和OC的sqlite不是線程安全的嘛他炊。 coredata 建議為每個(gè)manageObjectContext一個(gè)線程争剿。

? ? ?改:在 Core Data 中使用并行的最重要的規(guī)則是:每一個(gè)NSManagedObjectContext必須只從創(chuàng)建它的進(jìn)程中訪問(wèn).

? ? ? ? 沒(méi)遇到過(guò)死鎖...也許不明crash就是死鎖已艰。待我今晚查查。

19. http的post和get啥區(qū)別蚕苇?(區(qū)別挺多的哩掺,麻煩多說(shuō)點(diǎn))

? ? ?1 get的參數(shù)都在url里嘛。post的在body里涩笤。

? ? ?2 get的數(shù)據(jù)有限嚼吞,post的較大。

? ?3 ? 根據(jù) HTTP 協(xié)議的定義 GET 類型的請(qǐng)求是冪等的, 而 POST 請(qǐng)求是有副作用的, 也就是說(shuō) GET 用于獲取一些資源, 而 POST 用于改變一些資源, 這可能會(huì)創(chuàng)建新的資源或更新已有的資源.

20. 我知道你大學(xué)畢業(yè)過(guò)后就沒(méi)接觸過(guò)算法數(shù)據(jù)結(jié)構(gòu)了蹬碧,但是請(qǐng)你一定告訴我什么是Binary search tree? search的時(shí)間復(fù)雜度是多少舱禽?我很想知道!

? ? ? ? 這題我不會(huì)恩沽,查資料得知:

? ? ? ? ?左邊的子節(jié)點(diǎn)都比父節(jié)點(diǎn)心啬琛(大),右邊的子節(jié)點(diǎn)比左邊的子節(jié)點(diǎn)大(徐)。

? ? ? ? 搜索的時(shí)間復(fù)雜度是數(shù)的高度绽昏,插入和查找的時(shí)間復(fù)雜度均為lgN协屡,但是在最壞的情況下仍然會(huì)有N的時(shí)間復(fù)雜度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末全谤,一起剝皮案震驚了整個(gè)濱河市肤晓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌认然,老刑警劉巖补憾,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卷员,居然都是意外死亡盈匾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門毕骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)削饵,“玉大人,你說(shuō)我怎么就攤上這事未巫×耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵叙凡,是天一觀的道長(zhǎng)劈伴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)握爷,這世上最難降的妖魔是什么跛璧? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任严里,我火速辦了婚禮,結(jié)果婚禮上赡模,老公的妹妹穿的比我還像新娘田炭。我一直安慰自己,他們只是感情好漓柑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布教硫。 她就那樣靜靜地躺著,像睡著了一般辆布。 火紅的嫁衣襯著肌膚如雪瞬矩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天锋玲,我揣著相機(jī)與錄音景用,去河邊找鬼。 笑死惭蹂,一個(gè)胖子當(dāng)著我的面吹牛伞插,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盾碗,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼媚污,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了廷雅?” 一聲冷哼從身側(cè)響起耗美,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎航缀,沒(méi)想到半個(gè)月后商架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芥玉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蛇摸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灿巧。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皇型,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砸烦,到底是詐尸還是另有隱情弃鸦,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布幢痘,位于F島的核電站唬格,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜购岗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一汰聋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喊积,春花似錦烹困、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绎签,卻和暖如春枯饿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诡必。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工奢方, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爸舒。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓蟋字,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扭勉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愉老,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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