標籤:
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