系統就為我們將主線程的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...