iOS RunLoop 自己的理解

2021-07-12 03:38:26 字數 1484 閱讀 6884

系統就為我們將主線程的main runloop隱式的啟動了。runloop顧名思義就是乙個「迴圈」,他不停地執行,從程式開始到程式退出。正是由於這個「迴圈」在不斷地監聽各種事件,程式才有能力檢測到使用者的各種觸控互動、網路返回的資料才會被檢測到、定時器才會在預定的時間觸發操作……

runloop只接受兩種任務:輸入源和定時源。本文中說的就是定時源。預設狀態下,子執行緒的runloop中沒有加入我們自己的源,那麼我們在子執行緒中使用自己的定時器時,就需要自己加到runloop中,並啟動該子執行緒的runloop,這樣才能正確的執行定時器。

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

a 主線程的runloop自動建立,子執行緒的runloop預設不建立(在子執行緒中呼叫nsrunloop *runloop = [nsrunloop currentrunloop];

獲取runloop物件的時候,就會建立runloop);

c 同一時間乙個runloop只能在乙個mode,切換mode只能退出runloop,再重進指定mode(隔離modeitems使之互不干擾);

d 乙個item可以加到不同mode;乙個mode被標記到commonmodes裡(這樣runloop不用切換mode)

我們通常在主線程中使用nstimer,有個實際遇到的問題需要注意。當滑動介面時,系統為了更好地處理ui事件和滾動顯示,主線程runloop會暫時停止處理一些其它事件,這時主線程中執行的nstimer就會被暫停。解決辦法就是改變nstimer執行的mode(mode可以看成事件型別),不使用預設的nsdefaultrunloopmode,而是改用nsrunloopcommonmodes,這樣主線程就會繼續處理nstimer事件了。具體**如下:

nstimer *timer =

[nstimer timerwithtimeinterval:

1.0 target:

self selector:

@selector

(timer:)userinfo:

nil repeats:

yes];

[[

nsrunloop currentrunloop] addtimer:t

imer formode:

nsrunloopcommonmodes

];

runloop下也有自己的自動釋放池,用於儲存runloop下的變數等。

//runloop的自動釋放池是什麼時候建立和銷毀的

第一次建立:當runloop開啟的時候

最後一次銷毀:kcfrunloopexit 當runloop退出的時候

其他:當runloop即將休眠的時候會把之前的自動釋放池銷毀,然後建立乙個新的自動釋放池

runloop執行邏輯

this指向自己理解的

關於this,總結起來,主要有以下幾個途徑能夠被運用到。1 物件方法中呼叫this 如果函式被當中物件的乙個方法進行呼叫,則this值指向該物件。var person person.sayname this person,alert welcome alice 在這裡,函式的this指向該物件 即 ...

java 自己理解

oop 物件導向程式設計.模擬現實世界.現實世界裡面的事物 移到計算機裡面 用計算機 語言描述.用人的思維解決現實問題 資料 計算機加工處理的物件 資料結構 某種方式組織起來的資料的集合 資料都是有某種型別的.如數字 字串 boolean 如何描述資料型別呢?1 乙個值的集合.2 乙個操作的集合 這...

RSA演算法,自己的理解!

昨晚看書的時候,看到了rsa的演算法,不是很懂,所以今天早上就早早起來看了關於rsa的書。搞了好久才弄得明白!rsa演算法的描述 1.選取足夠大的兩個素數p和q,令n p q,則t p 1 q 1 這裡的t用到的是尤拉定理來算的。2.選取適當的加密金鑰e和解密金鑰d,使得其滿足e d 1 mod t...