第9章 RunLoop面試問題

2021-09-02 06:47:27 字數 3077 閱讀 7697

一、概念

1、什麼是runloop?

runloop是通過內部維護的事件迴圈來對事件/訊息進行管理的乙個物件。

2、什麼是事件迴圈?

沒有訊息需要處理時,休眠以避免資源占用,此時當前執行緒的控制權由使用者態切換到核心態;有訊息需要處理時,立即被喚醒,此時狀態由核心態切換到使用者態。

3、應用程式的main函式為什麼能一直執行不退出?

二、資料結構

對runloop的資料結構深入了解後才能對runloop的事件迴圈機制更好的理解。

runloop的資料結構主要有三個:cfrunloop、cfrunloopmode、source/timer/observer

cfrunloop的主要成員為pthread、currentmode、modes、commonmodes、commonmodeitems。pthread代表執行緒,runloop和執行緒是一一對應的關係;currentmode是cfrunloopmode這個資料結構的物件;modes是nsmutableset這麼乙個集合;commonmodes是nsmutableset這麼乙個集合,儲存commonmode對映的mode,將事件新增到commonmode時會將事件新增到該集合的所有mode中,具體原始碼參考「runloop與nstimer」章節;commonmodeitems是包含observer、timer、source物件的集合,儲存被新增到commonmode中的事件源,具體原始碼參考「runloop與nstimer」章節。

cfrunloopmode的主要成員為name、sources0、sources1、observers、timers。name是字串型別,就是cfrunloopmode物件的名稱,如nsdefaultrunloopmode。sources0、sources1是mutableset型別,是無序的。observers、timers是mutablearray型別,是有序的。

cfrunloopsource分兩種:source0、source1。source0需要手動喚醒執行緒,source1具備喚醒執行緒的能力。source0使用時,你需要先呼叫 cfrunloopsourcesignal(source),將這個 source 標記為待處理,然後手動呼叫 cfrunloopwakeup(runloop) 來喚醒 runloop,讓其處理這個事件。注意:timer和source1(也就是基於port的source)可以反覆使用,比如timer設定為repeat,port可以持續接收訊息,而source0在一次觸發後就會被runloop移除。

cfrunlooptimer是基於事件的定時器,它和nstimer是可以toll-free bridged(免費橋轉換)的。

cfrunloopobserver用於觀測cfrunloop的時間點,有6個:kcfrunloopentry(即將進入loop)、kcfrunloopbeforetimers(即將處理 timer)、kcfrunloopbeforesources(即將處理 source )、kcfrunloopbeforewaiting(即將進入休眠 )、kcfrunloopafterwaiting(剛從休眠中喚醒)、kcfrunloopexit(即將退出loop)。

三、cfrunloop各資料結構之間的關係

作者說這很能體現開發者對runloop的理解深度,用於區分開發者的級別。

runloop和執行緒是一對一的關係,和mode是一對多的關係。而mode和source/timer/observer也是一對多的關係。如下圖

1、如何將事件同時加入兩個mode?

此時需要用到nsrunloopcommonmodes,它並不是乙個實際存在的模式,他是同步source/timer/observer到多個mode中的一種技術解決方案。

四、事件迴圈機制

nsrunloop和cfrunloop的run相關方法最終都會呼叫cfrunloop 的void cfrunlooprun()函式。

五、runloop與nstimer

1、滑動tableview的時候我們的定時器還會生效嗎?

不會生效,因為滑動tableview時runloop工作的mode發生了切換。此時需要呼叫void cfrunloopaddtimer(runloop, timer, commonmode)將timer新增到nsrunloopcommonmodes下,該方法的原始碼如下:

六、runloop與多執行緒

執行緒和runloop是一一對應的。自己建立的執行緒預設是沒有啟動runloop的。

1、怎樣實現乙個常駐執行緒?

1)、為當前執行緒開啟乙個runloop。

2)、向該runloop中新增乙個port/source等維持runloop的事件迴圈。

3)、啟動該runloop。

2、常駐執行緒實現**

3、怎樣保證子執行緒資料回來更新ui的時候不打斷使用者的滑動操作?

封裝乙個事件,將事件新增到主線程的defaultmode中。

It面試問題

一般第一輪技術面都是來考察你最基本的技術功底。招聘季節,隨處可見抱著厚厚的 程式設計師面試寶典 啃的學生。偶爾也能看見 程式設計之美 劍指offer 的神書。這些經驗書確實有用。但是要想全面的掌握筆試面試的基礎考點,還是需要完整的複習。其實,筆試面試對計算機基礎的考察是萬變不離其宗的。其考點無非分為...

面試 Hbase面試問題

1.hbase怎麼預分割槽?2.hbase怎麼給web前台提供介面來訪問?3.htable api有沒有執行緒安全問題,在程式中是單例還是多例?4.hbase有沒有併發問題?5.metaq訊息佇列,zookeeper集群,storm集群,就可以完成對 推薦系統功能嗎?還有沒有其他的中介軟體?6.st...

面試問題 十大面試問題

在面試中,你會被問到的問題將是 對於許多不同型別的工作,一般問題可以是相同的。以下是一些可以被問到的常見問題。1.你的技能 您的面試官想知道您是否具備完成工作的技能,因此他們可能會問 了解自己的優勢,並提及與您正在接受面試的工作相關的優勢。盡可能提供您之前的工作或生活經歷的例子。雇主尋求的典型優勢是...