簡書博客已經(jīng)暫停更新,想看更多技術(shù)博客請到:
2018.08.31更新:
筆者最新有關(guān)面試的兩篇文章:
2017.06.12更新:
要答案的朋友比我想象的要多,這些題的答案我并沒有特意花時間整理好,因為給出答案并不在我的原計劃之內(nèi),但是還請各位理解一下我個人的時間安排。
本文中的面試題在網(wǎng)上都比較容易搜的到,而且有些題目來自于ChenYilong/iOSInterviewQuestions。
如果在時間和排期允許的情況下我一定會告知大家出一份答案的。謝謝理解!

就在上個月中旬,技術(shù)老大讓我招兩個1-2年的iOS開發(fā),把簡歷的篩選和第一輪技術(shù)面試的任務交給了我。
從篩選第一份簡歷,準備面試題,到成功招到兩個人一共花了兩個星期多一點,總體來說還是比較順利的。兩位通過者都比較穩(wěn)重踏實,而且對技術(shù)也比較有追求。這也可能和我篩選簡歷比較謹慎有關(guān)系,這次篩選簡歷所花費的精力是不比面試花費的少的。
雖然時間跨度不是很長,但是畢竟是第一次,所以有些感觸,想總結(jié)出來分享給大家。這篇總結(jié)分為兩個部分:
- 第一部分是我當時準備的面試題
- 第二部分是我的心得
我重點在本文的第二部分說一下這次面試別人的心得體會。而關(guān)于第一部分的面試題,文中不提供答案(因為不是本文的重點),有想討論的歡迎在評論區(qū)留言。
第一部分:面試題
注意,下面這些題只是我準備的題庫。在實際面試的時候我會根據(jù)面試者的水平抽出相應的題目來出的。
技術(shù)
基礎(chǔ)
- 為什么說Objective-C是一門動態(tài)的語言?
- 講一下MVC和MVVM,MVP?
- 為什么代理要用weak?代理的delegate和dataSource有什么區(qū)別?block和代理的區(qū)別?
- 屬性的實質(zhì)是什么?包括哪幾個部分?屬性默認的關(guān)鍵字都有哪些?@dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來做什么的?
- 屬性的默認關(guān)鍵字是什么?
- NSString為什么要用copy關(guān)鍵字,如果用strong會有什么問題?(注意:這里沒有說用strong就一定不行。使用copy和strong是看情況而定的)
- 如何令自己所寫的對象具有拷貝功能?
- 可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別?如果是集合是內(nèi)容復制的話,集合里面的元素也是內(nèi)容復制么?
- 為什么IBOutlet修飾的UIView也適用weak關(guān)鍵字?
- nonatomic和atomic的區(qū)別?atomic是絕對的線程安全么?為什么?如果不是,那應該如何實現(xiàn)?
- UICollectionView自定義layout如何實現(xiàn)?
- 用StoryBoard開發(fā)界面有什么弊端?如何避免?
- 進程和線程的區(qū)別?同步異步的區(qū)別?并行和并發(fā)的區(qū)別?
- 線程間通信?
- GCD的一些常用的函數(shù)?(group,barrier,信號量,線程同步)
- 如何使用隊列來避免資源搶奪?
- 數(shù)據(jù)持久化的幾個方案(fmdb用沒用過)
- 說一下AppDelegate的幾個方法?從后臺到前臺調(diào)用了哪些方法?第一次啟動調(diào)用了哪些方法?從前臺到后臺調(diào)用了哪些方法?
- NSCache優(yōu)于NSDictionary的幾點?
- 知不知道Designated Initializer?使用它的時候有什么需要注意的問題?
- 實現(xiàn)description方法能取到什么效果?
- objc使用什么機制管理對象內(nèi)存?
中級
Block
- block的實質(zhì)是什么?一共有幾種block?都是什么情況下生成的?
- 為什么在默認情況下無法修改被block捕獲的變量? __block都做了什么?
- 模擬一下循環(huán)引用的一個情況?block實現(xiàn)界面反向傳值如何實現(xiàn)?
Runtime
- objc在向一個對象發(fā)送消息時,發(fā)生了什么?
- 什么時候會報unrecognized selector錯誤?iOS有哪些機制來避免走到這一步?
- 能否向編譯后得到的類中增加實例變量?能否向運行時創(chuàng)建的類中添加實例變量?為什么?
- runtime如何實現(xiàn)weak變量的自動置nil?
- 給類添加一個屬性后,在類結(jié)構(gòu)體里哪些元素會發(fā)生變化?
RunLoop
- runloop是來做什么的?runloop和線程有什么關(guān)系?主線程默認開啟了runloop么?子線程呢?
- runloop的mode是用來做什么的?有幾種mode?
- 為什么把NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運行循環(huán)以后,滑動scrollview的時候NSTimer卻不動了?
- 蘋果是如何實現(xiàn)Autorelease Pool的?
類結(jié)構(gòu)
- isa指針?(對象的isa,類對象的isa,元類的isa都要說)
- 類方法和實例方法有什么區(qū)別?
- 介紹一下分類,能用分類做什么?內(nèi)部是如何實現(xiàn)的?與該類原有方法的名稱相同的時候,為什么原有方法會失效?
- 運行時能增加成員變量么?能增加屬性么?如果能,如何增加?如果不能,為什么?
- objc中向一個nil對象發(fā)送消息將會發(fā)生什么?(返回值是對象,是標量,結(jié)構(gòu)體)
高級
- UITableview的優(yōu)化方法(緩存高度,異步繪制,減少層級,hide,避免離屏渲染)
- 有沒有用過運行時,用它都能做什么?(交換方法,創(chuàng)建類,給新創(chuàng)建的類增加方法,改變isa指針)
- 看過哪些第三方框架的源碼?都是如何實現(xiàn)的?(如果沒有,問一下多圖下載的設(shè)計)
- SDWebImage的緩存策略?
- AFN為什么添加一條常駐線程?
- KVO的使用?實現(xiàn)原理?(為什么要創(chuàng)建子類來實現(xiàn))
- KVC的使用?實現(xiàn)原理?(KVC拿到key以后,是如何賦值的?知不知道集合操作符,能不能訪問私有屬性,能不能直接訪問_ivar)
項目
- 有已經(jīng)上線的項目么?
- 項目里哪個部分是你完成的?(找一個亮點問一下如何實現(xiàn)的)
- 開發(fā)過程中遇到過什么困難,是如何解決的?
學習
- 遇到一個問題完全不能理解的時候,是如何幫助自己理解的?舉個例子?
- 有看書的習慣么?最近看的一本是什么書?有什么心得?
- 有沒有使用一些筆記軟件?會在多平臺同步以及多渠道采集么?(如果沒有,問一下是如何復習知識的)
- 有沒有使用清單類,日歷類的軟件?(如果沒有,問一下是如何安排,計劃任務的)
- 平??床┛兔??有沒有自己寫過?(如果寫,有哪些收獲?如果沒有寫,問一下不寫的原因)
有關(guān)技術(shù)類的問題可以在評論區(qū)留言,我重點說一下這輪面試的心得和體會。
第二部分:心得
面試者千萬不要答非所問
如果讓我選一個讓面試官覺得印象減分的點,答非所問應該是首當其沖的。
面試者一定要知道面試官問的點是什么。
- 如果在知道面試官問的點,但是自己卻不知道答案的時候,可以提出思路,思考過程。其實有幾次面試者在我的引導下很容易就把答案說出來了,認清問題的點是解決問題的一半。
- 如果沒有理解好面試官問的問題,一定要事先和面試官確認好。
其實這也屬于溝通能力的一點:如果不能保證和對方溝通內(nèi)容的一致性,自己弄個filter把對方的話都曲解了,以后合作的時候又怎能保證溝通好呢?
面試者一定不要來得太早
這里說的來得太早,是來得太早并告知面試官自己已經(jīng)來了。
因為在約定好的面試時間之前,往往面試官還有別的事情在做,如果他知道你來的很早,就可能會擾亂他的計劃。有一位面試者早來了1個小時,結(jié)果把我們的面試計劃打亂了,而且正好是我的第一次面試,所以真的是有點措手不及。
求職者和公司定下來的時間屬于一個約定,約定是要遵守的。而且遵守約定同樣也是對對方的尊重。如果入職之前都沒能把握好,入職之后又如何能保證把握好呢?
實踐與理論的脫節(jié),讓人很不安
能做出來項目,但是基礎(chǔ)知識很薄弱
幾乎每位面試者都能給我展示他做的一些app,雖然沒有很難的功能,但也都算是有板有眼??勺屛冶容^意外的是,雖然能做出有模有樣的app,但當我問到很多基礎(chǔ)的問題的時候卻答不上來,比如屬性和成員變量的區(qū)別,屬性的默認關(guān)鍵字,Designated Initializer的概念等等。。
這不禁讓我懷疑他們的代碼的穩(wěn)定性,更懷疑他們治學,做技術(shù)的態(tài)度。
雖說技術(shù)活需要實踐的磨練,但和理論脫節(jié)的技術(shù)是鉆不深的。可能有人會說我的面試題過于理論,實際中用不到。但有些時候,在實際開發(fā)中遇到的一些問題往往就是因為一些很基本的東西沒有弄清導致的,相信你我都深有體會。
而且,我們都知道技術(shù)的提升是階梯式的。什么是階梯式的呢?就是可能我們會有比較長的時間才會有一個突破。但這個突破來的有多快,提升的有多高,是跟平時每個細小知識點的掌握程度是分不開的。
因為知識也是有復利效應的,準確地掌握越多的知識點,在以后的學習過程中,這些知識點相互之間想成的積極作用會越來越大:對新知識的理解更快,對問題的定位會更準,解決問題的方法也會越多。相反,如果你每個問題都得過且過,這些結(jié)果的復合作用就會導致你今后很難會有所突破了。
真的可能被簡歷騙到
上家的薪資很高,但是實際能力很不符
有一位面試者在簡歷里號稱上一個工作拿了15k,但當我問到NSString屬性使用strong還是copy作為關(guān)鍵字的時候他說是strong,而且用copy和strong的區(qū)別也不清楚,甚至連delegate都拿不準使用strong還是weak,我就有些奇怪了。
看技術(shù)博客和技術(shù)書籍的人還是很少的
只依賴于公司里的項目應該是不夠的,畢竟不是每個公司里都有上乘的代碼和技術(shù)
面試了大概20個人,但是真正有看過技術(shù)博客和技術(shù)書籍的真的不多,更別提Github了。不過其中一位面試通過者是有g(shù)ithub賬號的,并且有幾個小項目,印象非常好,加了不少分。
我相信在這一行的未來,簡歷里面github賬號和博客絕對會越來越受重視:
- 一方面簡歷真的是應接不暇,而且同時千篇一律,很難找出亮點。
- 另一方面,如果可以把自己的代碼和成長展示給招聘公司,就會使得自己的能力在公司面前變得更加純粹和透明,更有助于找到適合你自己的公司。
以上就是我上個月的面試心得,希望大家多交流,有說的不對的地方還請多指正。
本篇已經(jīng)同步到個人博客:傳送門
本文已在版權(quán)印備案,如需轉(zhuǎn)載請訪問版權(quán)印。48422928
-------------------------------- 2018年7月17日更新 --------------------------------
注意注意?。?!
筆者在近期開通了個人公眾號,主要分享編程,讀書筆記,思考類的文章。
- 編程類文章:包括筆者以前發(fā)布的精選技術(shù)文章,以及后續(xù)發(fā)布的技術(shù)文章(以原創(chuàng)為主),并且逐漸脫離 iOS 的內(nèi)容,將側(cè)重點會轉(zhuǎn)移到提高編程能力的方向上。
- 讀書筆記類文章:分享編程類,思考類,心理類,職場類書籍的讀書筆記。
- 思考類文章:分享筆者平時在技術(shù)上,生活上的思考。
因為公眾號每天發(fā)布的消息數(shù)有限制,所以到目前為止還沒有將所有過去的精選文章都發(fā)布在公眾號上,后續(xù)會逐步發(fā)布的。
而且因為各大博客平臺的各種限制,后面還會在公眾號上發(fā)布一些短小精干,以小見大的干貨文章哦~
掃下方的公眾號二維碼并點擊關(guān)注,期待與您的共同成長~
