1. 程式人生 > >面試常問的Runloop和Runtime基礎

面試常問的Runloop和Runtime基礎

一:Runloop

不知道大家有沒有想過這個問題,一個應用開始執行以後放在那裡,如果不對它進行任何操作,這個應用就像靜止了一樣,不會自發的有任何動作發生,但是如果我們點選介面上的一個按鈕,這個時候就會有對應的按鈕響應事件發生。給我們的感覺就像應用一直處於隨時待命的狀態,在沒人操作的時候它一直在休息,在讓它幹活的時候,它就能立刻響應。其實,這就是run loop的功勞。

執行緒與run loop

1 執行緒任務的型別
再來說說執行緒。有些執行緒執行的任務是一條直線,起點到終點;而另一些執行緒要乾的活則是一個圓,不斷迴圈,直到通過某種方式將它終止。直線執行緒如簡單的HelloWorld,執行列印完,它的生命週期便結束了,像曇花一現那樣;圓型別的如作業系統,一直執行直到你關機。在IOS中,圓型的執行緒就是通過runloop不停的迴圈實現的。

2 執行緒與run loop的關係

Run loop,正如其名,loop表示某種迴圈,和run放在一起就表示一直在執行著的迴圈。實際上,runloop和執行緒是緊密相連的,可以這樣說run loop是為了執行緒而生,沒有執行緒,它就沒有存在的必要。Runloops是執行緒的基礎架構部分,Cocoa和CoreFundation都提供了run loop物件方便配置和管理執行緒的runloop(以下都已Cocoa為例)。每個執行緒,包括程式的主執行緒(main thread)都有與之相應的run loop物件。

3 主執行緒的run loop預設是啟動的。

iOS的應用程式裡面,程式啟動後會有一個如下的main() 函式:
intmain(intargc,char*argv[])
{
@autoreleasepool{
returnUIApplicationMain(argc, argv,nil,NSStringFromClass([appDelegateclass]));
}
}

重點是UIApplicationMain() 函式,這個方法會為main thread 設定一個NSRunLoop 物件,這就解釋了本文開始說的為什麼我們的應用可以在無人操作的時候休息,需要讓它幹活的時候又能立馬響應。

4 對其它執行緒來說,run loop預設是沒有啟動的,如果你需要更多的執行緒互動則可以手動配置和啟動,如果執行緒只是去執行一個長時間的已確定的任務則不需要。

5 在任何一個Cocoa程式的執行緒中,都可以通過:

NSRunLoop*runloop = [NSRunLoopcurrentRunLoop];

來獲取到當前執行緒的run loop。

關於Runloop的幾個特性

Runloop工作的特點:
1>當有時間發生時,Runloop會根據具體的事件型別通知應用程式作出相應;
2>當沒有事件發生時,Runloop會進入休眠狀態,從而達到省電的目的;
3>當事件再次發生時,Runloop會被重新喚醒,處理事件.
提示:一般在開發中很少會主動建立Runloop,而通常會把事件新增到Runloop中.

Runloop的優點

runloop就是一個事件處理迴圈,用來不停的監聽和處理輸入事件並將其分配到對應的目標上進行處理。如果僅僅是想實現這個功能,你可能會想一個簡單的

while迴圈不就可以實現了嗎,用得著費老大勁來做個那麼複雜的機制?顯然,蘋果的架構設計師不是吃乾飯的,你想到的他們早就想過了。

首先,NSRunLoop是一種更加高明的訊息處理模式,他就高明在對訊息處理過程進行了更好的抽象和封裝,這樣才能是的你不用處理一些很瑣碎很低層次的

具體訊息的處理,在NSRunLoop中每一個訊息就被打包在input source或者是timer source(見後文)中了。

其次,也是很重要的一點,使用run loop可以使你的執行緒在有工作的時候工作,沒有工作的時候休眠,這可以大大節省系統資源。

什麼時候使用Runloop

時機:
1.當需要和該執行緒進行互動的時候才會使用Runloop.
2.一般情況下我們是沒有必要去啟用執行緒的RunLoop的,除非你在一個單獨的執行緒中需要長久的檢測某個事件。

使用:每一個執行緒都有其對應的RunLoop,但是預設非主執行緒的RunLoop是沒有執行的,需要為RunLoop新增至少一個事件源,然後去run它。

二:runtime

1.什麼是runtime?
RunTime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於C語言,函式的呼叫在編譯的時候會決定呼叫哪個函式。
runtime是一套底層的C語言API,包含很多強大實用的C語言資料型別和C語言函式,平時我們編寫的OC程式碼,底層都是基於runtime實現的。

2.runtime有什麼作用?

1.能動態產生一個類,一個成員變數,一個方法

2.能動態修改一個類,一個成員變數,一個方法

3.能動態刪除一個類,一個成員變數,一個方法

3:runtime在開發中的用途
一:動態的遍歷一個類的所有成員變數,用於字典轉模型,歸檔解檔操作
二:交換方法

通過runtime的method_exchangeImplementations(Method m1, Method m2)方法,可以進行交換方法的實現;一般用自己寫的方法(常用在自己寫的框架中,新增某些防錯措施)來替換系統的方法實現,常用的地方有:

在陣列中,越界訪問程式會崩,可以用自己的方法新增判斷防止程式出現崩潰陣列或字典中不能新增nil,如果新增程式會崩,用自己的方法替換系統防止系統崩潰。

除了獲取屬性列表之外,還有方法呼叫,攔截呼叫,動態新增方法屬性,關聯物件(新增屬性),方法交換,根據屬性值獲取屬性名稱(反射機制)等應用。

總結:

runtime 和 runloop 作為一個程式設計師進階是必須的,也是非常重要的, 在面試過程中是經常會被問到的, 所以大家有必要進行研究。

相關推薦

面試RunloopRuntime基礎

一:Runloop 不知道大家有沒有想過這個問題,一個應用開始執行以後放在那裡,如果不對它進行任何操作,這個應用就像靜止了一樣,不會自發的有任何動作發生,但是如果我們點選介面上的一個按鈕,這個時候就會有對應的按鈕響應事件發生。給我們的感覺就像應用一直處於隨時待

Java開發面試基礎知識點[精選]

Java基礎方面:  1、作用域public,private,protected,以及不寫時的區別答:區別如下: 作用域           當前類       同一package  子孫類       其他package public            √      

資料結構與集合篇一些常用的資料結構集合 面試部分(一)

java有8種之多,但是不用害怕事實上常用的資料結構也就那麼幾種, 常用的也就是雜湊表,向量,Properties,集合框架,棧(關於資料結構,我寫的不是很細,因為最近小編在準備求職,等小編有空會準備詳細程式碼來進行講解) 棧 在面試中棧經常與佇列一起出題。 棧/佇列 線

git之rebase、mergecherry pick的區別詳解—面試

git flow 鎮樓     merge 這個簡單,初學者常用。比如主分支是Dev,最新版本是01。然後小明基於此,搞了個feature 分支A,業務:打醬油 然後在上面多次提交,完成功能迭代開發,如A1 ---> A2 ---> A3 Dev 分支

【搞定 Java 併發面試面試的 Java 併發基礎見面試題總結!

本文為 SnailClimb 的原創,目前已經收錄自我開源的 JavaGuide 中(61.5 k Star!【Java學習+面試指南】 一份涵蓋大部分Java程式設計師所需要掌握的核心知識。歡迎 Star!)。 另外推薦一篇原創:終極推薦!可能是最適合你的Java學習路線+方法+網站+書籍推薦! Jav

Java 面試總結 面試的關鍵字總結

tile 說明 exception 處理 通信 析構 單繼承 完成 參數表 文章出處http://www.cnblogs.com/IUbanana/p/7116520.html 關鍵字: final finalize finally throws和throw static

java面試問題及部分答案(2018)

java 面試 2018年 基礎 一:java基礎1.簡述string對象,StringBuffer、StringBuilder區分string是final的,內部用一個final類型的char數組存儲數據,它的拼接效率比較低,實際上是通過建立一個StringBuffer,讓後臺調用appen

10個Python面試的問題

r+ evel 機器 一個 blank show for dict () 概述 Python是個非常受歡迎的編程語言,隨著近些年機器學習、雲計算等技術的發展,Python的職位需求越來越高。下面我收集了10個Python面試官經常問的問題,供大家參考學習。 類繼承 有如下的

JAVA面試知識總結(一)

try catch finally 的詳細用法: 1 public static int testBasic(){ 2 int i = 1; 3 try{ 4 i++; 5 System.out.printl

JAVA面試知識總結(二)

JAVA中的引數傳遞總結先看兩道筆試題: 1 public class Test2 { 2 3 public static void main (String [] args) { 4 StringBuffer a = new StringBuff

JAVA面試知識總結(三)——JVM

堆疊(Stack) : 如子彈入彈夾一樣 先進後出佇列(Queue):如排隊過隧道 先進先出ps:java中建立的物件都是放在java堆中的,方法區放置的是類的資訊,又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數。 2.方法區中包含的都是在整個程式中永遠唯一的元素,如c

JAVA面試知識總結(四)——集合

先附一張java集合框架圖   下面根據面試中常問的關於集合的問題進行了梳理: Arraylist 與 LinkedList 有什麼不同? 1. 是否保證執行緒安全: ArrayList 和 LinkedList 都是不同步的,也就是不保證執行緒安全; 2. 底

常用設計模式總結(面試

Singleton(單例模式) 一句話總結:一個類在Java虛擬機器中只有一個物件,並提供一個全域性訪問點。 生活中例子:太陽、月亮、國家主席等。 解決什麼問題:物件的唯一性,效能浪費太多。 專案裡面怎麼用:資料庫連線物件,屬性配置檔案的讀取物件。 模式結構:分為餓漢式和懶漢式(

JAVA面試知識總結(七)——Spring

如果一個接有2個不同的實現, 如何Autowire某一個指定的實現?   1、通過增加@Qualifier(實現類的名字): @Autowired @Qualifier("GirlStudentImpl") private Student student;   2、也可以通過@R

(面試)4種單例設計模式的總結(內含程式碼以及分析)

單例設計模式:     單例模式,是一種常見的軟體設計模式.在它的核心結構中只包含了一個被稱為單例的特殊類.通過單例模式可以保證系統中只有該類的一個例項物件.   優點 :     例項控制:單例模式會阻止其它物件例項化其自

JAVA面試知識總結(十)——Maven

Maven有哪些優點和缺點? 優點如下: 簡化了專案依賴管理: 易於上手,對於新手可能一個"mvn clean package"命令就可能滿足他的工作 便於專案升級,無論是專案本身升級還是專案使用的依賴升級。 有助於多模組專案的開發,一個模組開發好後,釋出到倉庫,依賴該模組

JAVA面試知識總結(十一)——Servlet

Servlet屬於執行緒安全的嗎?   Servlet不是執行緒安全的!    談談轉發和重定向的區別 請求轉發: request.getRequestDispatcher("/king_l2lu.jsp").forward(request,response); 重定向

Java面試計算機網路問題

一、GET 和 POST 的區別 GET請注意,查詢字串(名稱/值對)是在 GET 請求的 URL 中傳送的:/test/demo_form.asp?name1=value1&name2=value2 GET 請求可被快取 GET 請求保留在瀏覽

面試:什麼是紅黑樹?

什麼是紅黑樹? ———————————— 二叉查詢樹(BST)具備什麼特性呢? 1.左子樹上所有結點的值均小於或等於它的根結點的值。 2.右子樹上所有結點的值均大於或等於它的根結點的值。 3.左、右子樹也分

linux面試問題

問題一:     絕對路徑用什麼符號表示?當前目錄、上層目錄用什麼表示?主目錄用什麼表示? 切換目錄用什麼命令? 答案:     絕對路徑: 如/etc/init.d     當前目錄和上層目錄: ./  ../     主目錄: ~/     切換目錄: cd 問題二: