在百度找人內(nèi)推簡歷后,過了幾天,一個(gè)周五晚上7點(diǎn)多就來了電話面試,電話面完后,第二周的周一百度HR就來了電話,約一個(gè)現(xiàn)場面試。這里繼續(xù)回憶一下百度公司的第二輪面試真題。
| 面試形式 | 現(xiàn)場面試 |
|---|---|
| 面試節(jié)點(diǎn) | 第2輪 |
| 面試時(shí)間 | 6月某周四下午 |
| 面試地點(diǎn) | 深圳百度國際大廈 |
回憶版題目
筆者只作簡單的個(gè)人解析,拋轉(zhuǎn)引玉,歡迎讀者在評(píng)論區(qū)留下更多的見解~~
你簡單自我介紹一下吧
解析:學(xué)習(xí),工作經(jīng)歷,做過的項(xiàng)目,做過的輪子,做過的技術(shù)分享
講一講你對內(nèi)存管理的理解吧
解析:歸根結(jié)底就是引用計(jì)數(shù),新建對象,拷貝對象,設(shè)置新值,手動(dòng)釋放都會(huì)對它有影響??梢灾v講引用計(jì)數(shù)本身存儲(chǔ)的位置,這個(gè)讀者自己需要扒一扒runtime的源碼。筆者對這個(gè)曾做了解析:iOS系統(tǒng)源碼思考:對象的引用計(jì)數(shù)存儲(chǔ)在哪里?--從runtime源碼得到的啟示
ARC的底層原理,怎么實(shí)現(xiàn)自動(dòng)釋放的,和MRC的區(qū)別是什么?
解析:
ARC管理原則:只要一個(gè)對象沒有被強(qiáng)指針修飾就會(huì)被銷毀,默認(rèn)局部變量對象都是強(qiáng)指針,存放到堆里面,只是局部變量的強(qiáng)指針會(huì)在代碼塊結(jié)束后釋放,對應(yīng)所指向的內(nèi)存空間也會(huì)被銷毀。
MRC沒有strong,weak,局部變量對象就是相當(dāng)于基本數(shù)據(jù)類型。MRC給成員屬性賦值,一定要使用set方法,不能直接訪問下劃線成員屬性賦值,因?yàn)槭褂孟聞澗€是直接賦值(如_name = name),而set方法會(huì)多做影響引用計(jì)數(shù)方面的事情,比如retain。
蘋果為什么推出ARC?
在MRC時(shí)代,我們要想保持一個(gè)對象,只要“retain”?,F(xiàn)在的ARC是不需要了,現(xiàn)在只需用一個(gè)指針指向這個(gè)對象,無非2種情況:第一:指針為空時(shí),對象被釋放咯。第二:指針不為空,對象會(huì)一直保存在堆里,如果當(dāng)指針指向一個(gè)新的值時(shí),原來的對象會(huì)被release一次,這個(gè)系統(tǒng)會(huì)在合適的時(shí)候自動(dòng)幫我們搞掂,不需我們關(guān)心。
而在ARC時(shí),只要對象指針被置空,就會(huì)釋放。否則,對象就會(huì)一直保持在堆上。當(dāng)將指針指向新值時(shí),原來的對象會(huì)被release 一次。
有了線程,你覺得為什么還要有runloop?,runloop和線程有什么關(guān)系?
解析:關(guān)于為什么要,我覺得runloop是來管理線程的,當(dāng)線程的runloop被開啟后,線程會(huì)在執(zhí)行完任務(wù)后進(jìn)入休眠狀態(tài),有了任務(wù)就會(huì)被喚醒去執(zhí)行任務(wù)。
關(guān)于這兩者的更多關(guān)系:
- runloop與線程是一一對應(yīng)的,一個(gè)runloop對應(yīng)一個(gè)核心的線程,為什么說是核心的,是因?yàn)閞unloop是可以嵌套的,但是核心的只能有一個(gè),他們的關(guān)系保存在一個(gè)全局的字典里。
- runloop在第一次獲取時(shí)被創(chuàng)建,在線程結(jié)束時(shí)被銷毀。
- 對于主線程來說,runloop在程序一啟動(dòng)就默認(rèn)創(chuàng)建好了。
- 對于子線程來說,runloop是懶加載的,只有當(dāng)我們使用的時(shí)候才會(huì)創(chuàng)建,所以在子線程用定時(shí)器要注意:確保子線程的runloop被創(chuàng)建,不然定時(shí)器不會(huì)回調(diào)。
runloop你認(rèn)為是怎么實(shí)現(xiàn)的?
解析:關(guān)于實(shí)現(xiàn)原理,我回答的不好,就說了個(gè)do while循環(huán)。我猜測面試官可能的想要的出發(fā)點(diǎn)是基于CFRunLoopRef分析?我問面試官給個(gè)提示,他說面試官不回答面試者問題,所以暫無從所知。熟悉這塊的讀者也可以留下自己的想法。
NSRunLoop是基于CFRunLoopRef的一層OC包裝,因此我們需要研究CFRunLoopRef層面的API(Core Foundation層面)。
CF層面創(chuàng)建線程的代碼分析: