自動釋放池 訊息迴圈

2022-03-09 03:15:03 字數 1422 閱讀 3474

執行迴圈(runloop):

保證程式不退出 (死迴圈)

監聽所有的事件 點選,觸控等 網路資料載入完成

特性:沒有事件的時候 會進行休眠 一旦監聽到事件 會立即響應

每乙個執行緒都會有乙個runloop 預設是關閉的,只有主線程的runloop 會啟動

當乙個程式執行起來的時候,只有主線程的訊息迴圈是預設開啟的,子執行緒的訊息迴圈預設是關閉的若想要去讓子執行緒需要實現下面這個方法

nsthread *thread = [[nsthread alloc]initwithtarget:self selector:@selector(demo) object:nil];

[thread start];

// 輸入源事件

[self performselector:@selector(demo2) onthread:thread withobject:nil waituntildone:no];

- (void)demo{

// 若是把這個迴圈新增在這,那麼下面那句永遠不會執行,因為執行迴圈就是乙個死迴圈..程式也不死

1.    //1. [[nsrunloop currentrunloop]run];

[[nsrunloop currentrunloop]rununtildate:[nsdate datewithtimeintervalsincenow:2.0]];

nslog(@"haha");

- (void)demo2{

nslog(@"%@",[nsthread currentthread]);

nslog(@"demo2");

/輸入事件:

11.輸入源事件

滑鼠事件

鍵盤事件

[self performselector:@selector(demo2) onthread:thread withobject:nil waituntildone:no];

2.定時器事件

自動釋放池作用:

延遲釋放 : 所有用類方法例項出來的物件 都是延遲釋放的

所有延遲釋放的物件 在出了作用域之後 會被自動新增到最新的自動釋放池中 不會立即釋放

自動釋放池釋放後會向池子裡的所有物件傳送release訊息關係1

.開始 執行狀態處於休眠狀態

2.事件觸發,執行迴圈開始工作

3.建立自動釋放池

4,所有事件建立的物件都放在的自動釋放池中

5.(事件完成)自動釋放池結束 向物件傳送一次release訊息

6執行迴圈又進入到休眠狀態

當事件啟動 是runloop建立的自動釋放池

arc 中 自動釋放池也是工作的

自動釋放池和執行 訊息迴圈

自動釋放池 1 如果在迴圈中建立了大量的臨時變數的時候需要在迴圈一開始就手動建立乙個自動釋放池 解讀 這段 有什麼問題?for int i 0 i 1000000 i 問題 for迴圈裡面建立了大量的臨時變數儲存在堆區,雖然變數每次都出for迴圈的作用域,但不會被銷毀,因此會導致記憶體暴漲。解決 每...

自動釋放池

自動釋放池是什麼時候建立的?又是什麼時候銷毀的?原題 思考 1,有返回值的類方法建立出來的物件都是autorelease的。autorelease物件出了作用域後,就會被新增到自動釋放池中。如果largenumber非常大,有可能在乙個for中就把自動釋放池填滿,記憶體消耗非常大!2,解決方案 在f...

自動釋放池

autorelease本質上就是延遲呼叫release方法 autorelease物件什麼時候釋放?引用計數為0的時候才會釋放,不是出了pool就釋放 在一些很消耗記憶體的迴圈呼叫的場景下有時需要手動干預autoreleased物件的釋放時機,不然會導致記憶體暴增,最終導致程式崩潰 nsthread...