疑難點積累(二)

2021-06-23 09:22:07 字數 1334 閱讀 8192

參考文章:

這裡有詳細的驗證和說明

(1)timer會對它的target進行retain,直到timer自己失效為止。對重複執行的timer必須呼叫invalidate才能停止timer,讓timer失效。

(2)timer並不是一種實時機制,不是你指定1s後執行,1s後就會立即執行。當執行緒空閒的時候,timer的觸發時間還是比較準確的。但是當到達timer的觸發時間時,執行緒卻在執行乙個連續的運算塊,這個時候,timer只能等這個運算塊執行完了,才能執行它自己的方法。如果這個執行緒的執行的時間超過了timer的乙個週期,timer並不會觸發兩次訊息,而只是觸發一次。等執行緒忙完後,後面的訊息觸發時間仍然是與timer開始指定的時間成整數倍。所以說,timer並不會因為觸發延遲而導致後面的觸發時間發生延遲。

(3)timer也是一種資源,乙個資源如果要起作用就得加到執行緒的runloop中,所以timer要加到runloop中才有用。如果乙個runloop不包含任何資源,那他一執行就會馬上退出。

a、使用 scheduledtimerwithtimeinterval:invocation:repeats: 或者scheduledtimerwithtimeinterval:target:selector:userinfo:repeats: 這兩個類方法建立乙個timer會把timer指定到乙個預設的runloop模式中。

b、使用 timerwithtimeinterval:invocation:repeats: 或者 timerwithtimeinterval:target:selector:userinfo:repeats:這兩個類方法建立乙個timer的物件,你必須手動的呼叫nsrunloop下對應的方法 addtimer:formode: 去將timer指定到乙個runloop模式中。

c、 使用 initwithfiredate:interval:target:selector:userinfo:repeats: 方法分配並建立乙個nstimer的例項,當建立之後,你必須手動的呼叫nsrunloop下對應的方法 addtimer:formode: 去將它指定到乙個runloop模式中。

(4)如何讓timer在子執行緒的runloop中跑起來?

每個執行緒都有自己的runloop,新的執行緒的runloop必須自己去啟動。

[[nsrunloop currentrunloop] addtimer:timer formode:nsdefaultrunloopmode];//將timer加到子執行緒的runloop中

[[nsrunloop currentrunloop] rununtildate:[nsdate datewithtimeintervalsincenow:3]];//啟動子執行緒的runloop

程式設計疑難點

下面的博文對於理解引數的傳遞和二級指標有幫助 自己補充一部分 void change val char p 2 p new val 3 此處發生引數拷貝,用p copy代替p,即用p copy指標指向了new val,為改變p所指向的值 printf fun address of p 0x x,co...

多型疑難點

多型 使用父類作為方法的形參 使用父類作為方法的返回值 父類作為方法的形參 通俗的說就是,只通過操作父類就可以達到操作子類的效果。使用的原理是向上轉型 父類的引用指向子類物件。自動進行型別轉換。注意 1 此時通過父類引用變數呼叫的方法是子類覆蓋或繼承父類的方法,不是父類的方法。再說,我們在父類裡也只...

面試疑難點解析

list,set,map,有什麼區別?list和set實際上市實現了collection介面,那麼collection介面的原理你能簡單描述一下嗎?list介面可以插入多個null值,並且重複值,而且list是乙個有序的集合。set是乙個不可重複的集合,裡面的元素都只出現,最多隻出現1次,並且set...