NSRunLoop的淺顯概述和原理

2021-07-02 15:51:01 字數 2289 閱讀 7101

iphone開發-nsrunloop概述和原理

1.什麼是nsrunloop?

什麼是nsrunloop呢?根據大眾化的理解,nsrunloop就是一種訊息處理機制,但是我理解為在程式執行時建立對訊息的一種對執行緒的監聽迴圈,讓執行緒在有訊息接收時處理訊息,沒有就進入睡眠,避免占用過多的記憶體,這也為多執行緒的處理成為可能。

2.利用nsrunloop阻塞nsoperation執行緒

這裡主要介紹一下使用nsrunloop阻塞執行緒。

主要使用在nstimer定時啟用的任務或者非同步獲取資料的情況如socket獲取網路資料,要阻塞執行緒,直到獲取資料之後在釋放執行緒。

下面是執行緒中沒有使用nsrunloop阻塞執行緒的**和執行效果:

在mytask.h檔案裡:

#import

@inte***ce mytask : nsoperation  

@end

在mytask.m檔案裡:

#import "mytask.h"

@implementation mytask

- (void)main

#pragma previous function:

- (void)main

- (void)handletime:(id)sender

- (void)dealloc

@end

在你的檢視控制器的viewdidload方法裡新增如下**:

- (void)viewdidload

執行結果為:

2015-05-18 11:43:27.574 examplefornsrunloop[1816:53652] 開始執行緒=

2015-05-18 11:43:27.574 examplefornsrunloop[1816:53651] 開始執行緒=

2015-05-18 11:43:27.575 examplefornsrunloop[1816:53658] 開始執行緒=

2015-05-18 11:43:37.477 examplefornsrunloop[1816:53658] delloc mytask=

2015-05-18 11:43:37.484 examplefornsrunloop[1816:53652] delloc mytask=

2015-05-18 11:43:37.484 examplefornsrunloop[1816:53651] delloc mytask=

為什麼並沒有執行定時器裡的方法就將mytask釋放了呢?因為程式在執行完main方法裡的內容之後就將mytask物件釋放掉了,而此時nstimer還要等待2秒才會執行,因此我們需要乙個有效「延遲」程式的東西,等待nstimer執行完之後才釋放掉這個物件,因此我們就用到了nsrunloop:

在mytask.m中增加成員變數和while迴圈,並改寫handletime:方法:

@implementation mytask

#pragma updated function

- (void)main}

- (void)handletime:(id)sender

此時列印結果為:

2015-05-18 11:57:29.648 examplefornsrunloop[1925:57701] 開始執行緒=

2015-05-18 11:57:29.650 examplefornsrunloop[1925:57700] 開始執行緒=

2015-05-18 11:57:29.652 examplefornsrunloop[1925:57699] 開始執行緒=

2015-05-18 11:57:31.657 examplefornsrunloop[1925:57700] 執行了nstimer

2015-05-18 11:57:31.658 examplefornsrunloop[1925:57700] delloc mytask=

2015-05-18 11:57:31.658 examplefornsrunloop[1925:57701] 執行了nstimer

2015-05-18 11:57:31.659 examplefornsrunloop[1925:57701] delloc mytask=

2015-05-18 11:57:31.659 examplefornsrunloop[1925:57699] 執行了nstimer

2015-05-18 11:57:31.660 examplefornsrunloop[1925:57699] delloc mytask=

因為while迴圈是在子執行緒中進行的,並不會阻塞主線程,所以既可以實現等待nstimer執行完釋放物件的效果,又能讓主線程繼續執行.

NSRunLoop概述和原理

1.什麼是nsrunloop?我們會經常看到這樣的 1 2 3 4 5 6 7 8 9 10 ibaction start id sender progress sethidden yes 2.nsrunloop工作原理 接下來看一下nsrunloop具體的工作原理,首先是官方文件提供的說法,看圖 ...

NSRunLoop概述和原理

1.什麼是nsrunloop?我們會經常看到這樣的 1 2 3 4 5 6 7 8 9 10 ibaction start id sender progress sethidden yes 2.nsrunloop工作原理 接下來看一下nsrunloop具體的工作原理,首先是官方文件提供的說法,看圖 ...

NSRunLoop 概述和原理

1.什麼是nsrunloop?我們會經常看到這樣的 ibaction start id sender progress sethidden yes 這段 很神奇的,因為他會 暫停 執行,而且程式執行不會因為這裡有乙個while迴圈而受到影響。在 progress sethidden no 執行之後,...