關於 IOS Runtime Runloop 2

來源:互聯網
上載者:User

標籤:

 Runtime 

也就是運行時組件,一個純C語言寫的基礎庫。

我們平時編寫的OC代碼中, 程式運行過程時, 其實最終都是轉成了runtime的C語言代碼 Objective-C編寫出來的程式必須得到runtime的運行才能正常運行。
NSObject的實現(其實就是和runtime做對接, 把自己連入runtime, 這樣繼承的子類就自動接入runtime了)

 

 

 

 

Runtime能幹嗎呢?

Runtime還允許我們通過標準的介面(C函數)對所有Objective-C類的變數、方法、屬性以及協議等等          作查詢和動態擴充
      Runtime 的另外一個重要的特性實現即為訊息派發,objc_msgSend是訊息派發最核心最基礎的入口函數

關於訊息發送;下面兩個方法有等同效果;
OC : [[MJPerson alloc] init];
runtime : objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)

isa是一個 Objective-C Class 類型的指標;執行個體對象有個isa的屬性,指向Class;

而Class裡也有個isa的屬性, 指向meteClass;

 

常用的runtime方法:

 
123 objc_setAssociatedObject ---> 設定關聯 class_addProperty([SomeClass class], "name", attrs, 3); --->添加屬性 class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "[email protected]:@"); --->添加方法

 

 

 

 

Runloop

RunLoop 就是一個迴圈的概念,或者準確的說是線程中的迴圈 實際上就是一個繼承NSObject的對象.

NSRunLoop的作用在於有事情做的時候使的當前NSRunLoop的線程工作,沒有事情做讓當前NSRunLoop的線程休眠;

每一個線程都有其對應的RunLoop,但是預設非主線程的RunLoop是沒有啟動並執行,需要為RunLoop添加至少一個事件來源,然後去run它。一般情況下我們是沒有必要去啟用線程的RunLoop的,除非你在一個單獨的線程中需要長久的檢測某個事件。

 

 豆電雨 摘自 http://blog.zuics.com/

 
1234567891011 BOOL pageStillLoading = YES; while (pageStillLoading) {MCLog(@"runloop 迴圈");[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];}MCLog(@"迴圈結束"); 最常用是一種runloop 使用方式 如果運行上面的代碼會發現 會卡住 不會列印“迴圈結束”!直到 pageStillLoading 何時被設定成NO  

關於 IOS Runtime Runloop 2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.