1樓:匿名使用者
首先說一下什麼是runtime:
runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式( c語言的函式呼叫請看這裡 )。
編譯完成之後直接順序執行,無任何二義性。oc的函式呼叫成為訊息傳送。屬於動態呼叫過程。
在編譯的時候並不能決定真正呼叫哪個函式(事實證明,在編 譯階段,oc可以呼叫任何函式,即使這個函式並未實現,只要申明過就不會報錯。而c語言在編譯階段就會報錯)。只有在真正執行的時候才會根據函式的名稱找 到對應的函式來呼叫。
舉例說明:
比如你[obj maketext];
則執行時就這樣的:首先,編譯器將**[obj maketext];轉化為objc_msgsend(obj, @selector (maketext));,在objc_msgsend函式中。首先通過obj的isa指標找到obj對應的class。
在class中先去cache中 通過sel查詢對應函式method(猜測cache中method列表是以sel為key通過hash表來儲存的,這樣能提高函式查詢速度),若 cache中未找到。再去methodlist中查詢,若methodlist中未找到,則取superclass中查詢。若能找到,則將method加 入到cache中,以方便下次查詢,並通過method中的函式指標跳轉到對應的函式中去執行。
2樓:匿名使用者
就索性進行了一番調研,於是有了本文(本次不討論越獄的ios)首先從情感上,你喜歡哪個就好,就像百事可樂和可口可樂,當然這個比喻不是很恰當,因為可樂喝起來幾乎一樣,但是android和ios還是有很大差別的。
3樓:
主要用來設定關聯物件,在分類可以使用屬性了。
ios 中runtime和runloop 的區別
4樓:東門瀾
一.runloop:
runloop是事件接收和分發機制的乙個實現。
runloop提供了一種非同步執行**的機制,不能並行執行任務。
在主佇列中,main runloop直接配合任務的執行,負責處理ui事件、定時器以及其他核心相關事件。
(1).runloop的主要目的:
保證程式執行的執行緒不會被系統終止。
(2).什麼時候使用runloop ?
當需要和該執行緒進行互動的時候才會使用runloop.
每乙個執行緒都有其對應的runloop,但是預設非主線程的runloop是沒有執行的,需要為runloop新增至少乙個事件源,然後去run它。
一般情況下我們是沒有必要去啟用執行緒的runloop的,除非你在乙個單獨的執行緒中需要長久的檢測某個事件。
主線程預設有runloop。當自己啟動乙個執行緒,如果只是用於處理單一的事件,則該執行緒在執行完之後就退出了。所以當我們需要讓該執行緒監聽某項事務
時,就得讓執行緒一直不退出,runloop就是這麼乙個迴圈,沒有事件的時候,一直卡著,有事件來臨了,執行其對應的函式。
runloop,正如其名所示,是執行緒進入和被執行緒用來相應事件以及呼叫事件處理函式的地方.需要在**中使用控制語句實現runloop的迴圈,也就是說,需要**提供while或者for迴圈來驅動runloop.
在這個迴圈中,使用乙個runloop物件[nsrunloop currentrunloop]執行接收訊息,呼叫對應的處理函式.
runloop接收兩種源事件:input sources和timer sources。
input sources 傳遞非同步事件,通常是來自其他執行緒和不同的程式中的訊息;
timer sources(定時器) 傳遞同步事件(重複執行或者在特定時間上觸發)。
除了處理input sources,runloop
也會產生一些關於本身行為的notificaiton。註冊成為runloop的observer,可以接收到這些notification,做一些額外
的處理。(使用corefoundation來成為runloop的observer)。
runloop工作的特點:
1>當有時間發生時,runloop會根據具體的事件型別通知應用程式作出相應;
2>當沒有事件發生時,runloop會進入休眠狀態,從而達到省電的目的;
3>當事件再次發生時,runloop會被重新喚醒,處理事件.
二.runtime:
runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式(
c語言的函式呼叫請看這裡
)。編譯完成之後直接順序執行,無任何二義性。oc的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式(事實證明,在編
譯階段,oc可以呼叫任何函式,即使這個函式並未實現,只要申明過就不會報錯。而c語言在編譯階段就會報錯)。只有在真正執行的時候才會根據函式的名稱找
到對應的函式來呼叫。
那oc是怎麼實現動態呼叫的呢?下面我們來看看oc通過傳送訊息來達到動態呼叫的秘密。假如在oc中寫了這樣的乙個**:
[objc] view plain?
[obj maketext];
其中obj是乙個物件,maketext是乙個函式名稱。對於這樣乙個簡單的呼叫。在編譯時runtime會將上述**轉化成
[objc] view plain?
objc_msgsend(obj,@selector(maketext));
首先我們來看看obj這個物件,ios中的obj都繼承於nsobject。
[objc] view plain?
@inte***ce nsobject
在nsobjcet中存在乙個class的isa指標。然後我們看看class:
[objc] view plain?
typedef struct objc_class *class;
struct objc_class {
class isa; // 指向metaclass
class super_class ; // 指向其父類
const charchar *name ; // 類名
long version ; // 類的版本資訊,初始化預設為0,可以通過runtime函式class_setversion和class_getversion進行修改、讀取
long info; // 一些標識資訊,如cls_class (0x1l) 表示該類為普通 class ,其中包含物件方法和成員變數;cls_meta (0x2l) 表示該類為 metaclass,其中包含類方法;
long instance_size ; // 該類的例項變數大小(包括從父類繼承下來的例項變數);
struct objc_ivar_list *ivars; // 用於儲存每個成員變數的位址
struct objc_method_list **methodlists ; // 與 info 的一些標誌位有關,如cls_class (0x1l),則儲存物件方法,如cls_meta (0x2l),則儲存類方法;
struct objc_cache *cache; // 指向最近使用的方法的指標,用於提公升效率;
struct objc_protocol_list *protocols; // 儲存該類遵守的協議
我們可以看到,對於乙個class類中,存在很多東西,下面我來一一解釋一下:
class
isa:指向metaclass,也就是靜態的class。一般乙個obj物件中的isa會指向普通的class,這個class中儲存普通成員變數和對
象方法(「-」開頭的方法),普通class中的isa指標指向靜態class,靜態class中儲存static型別成員變數和類方法(「+」開頭的方
法)。class super_class:指向父類,如果這個類是根類,則為null。
注意:所有metaclass中isa指標都指向跟metaclass。而跟metaclass則指向自身。
root metaclass是通過繼承root class產生的。與root class結構體成員一致,也就是前面提到的結構。不同的是root
metaclass的isa指標指向自身。
class類中其他的成員這裡就先不做過多解釋了,下面我們來看看:
@selector (maketext):
這是乙個sel方法選擇器。sel其主要作用是快速的通過方法名字(maketext)查詢到對應方法的函式指標,然後呼叫其函式。sel其本身是乙個
int型別的乙個位址,位址中存放著方法的名字。對於乙個類中。每乙個方法對應著乙個sel。所以ios類中不能存在2個名稱相同的方法,即使引數型別不
同,因為sel是根據方法名字生成的,相同的方法名稱只能對應乙個sel。
下面我們就來看看具體訊息傳送之後是怎麼來動態查詢對應的方法的。
首先,編譯器將**[obj maketext];轉化為objc_msgsend(obj, @selector
(maketext));,在objc_msgsend函式中。首先通過obj的isa指標找到obj對應的class。在class中先去cache中
通過sel查詢對應函式method(猜測cache中method列表是以sel為key通過hash表來儲存的,這樣能提高函式查詢速度),若
cache中未找到。再去methodlist中查詢,若methodlist中未找到,則取superclass中查詢。若能找到,則將method加
入到cache中,以方便下次查詢,並通過method中的函式指標跳轉到對應的函式中去執行。
5樓:網羅天下
iphone多執行緒程式設計提議用nsoperation和nsoperationqueue,這個確實很好用。但是有些情況下,我們還是在執行一些長線任務或者複雜任務的時候需要用比較原始的nsthread。這就需要為nsthread建立乙個runloop.
因為如果我們用現有的執行緒函式的話,這個執行緒只能是跑完一次任務,就釋放所佔有的資源了。
在開發中的英文怎麼說,軟體開發用英語怎麼說
developing 追問 這不是 正在發展中 的意思嗎?回答 乙個意思 或者說under development 追問 你確定是under 不是in啊,我覺得in更好點吧 回答 確定的 請放心 in development 在開發中 in developing countries在發展中國家in ...
ios開發中,怎麼用按鈕呼叫系統emoji表情
在ios中,開啟有輸入動作的控制項的屬性檢查器,在keyboard的下拉選項有10種型別鍵盤,可以根據需要進行選擇 大神求教,ios如何呼叫系統的emoji表情鍵盤 在ios中,開啟有輸入動作的控制項的屬性檢查器,在keyboard的下拉選項有10種型別鍵盤,可以根據需要進行選擇 各系統 ios m...
android開發中,可以用startactivity的方式
intent i new intent i.setaction mediastore.intent action still image camera startactivity i 開啟相機 相簿沒研究過 可以.設定intent屬性就行了.在android開發中,怎樣能夠呼叫系統自帶相機,而禁止出...