1把夸、runLoop是讓線程隨時(shí)處理事件而又不退出的機(jī)制灵嫌。
2、runLoop實(shí)際是一個(gè)對(duì)象钠绍,這個(gè)對(duì)象管理了其需要處理的事件和消息舆声,并提供了一個(gè)入口函數(shù)來執(zhí)行EventLoop的邏輯。在OSX/IOS系統(tǒng)中柳爽,提供了兩個(gè)這樣的對(duì)象:NSRunLoop和CFRunLoopRef媳握。CFRunLoopRef是純C的、線程安全的API磷脯,而NSRunLoop是基于CFRunLoopRef的封裝蛾找,提供了面向?qū)ο蟮摹⒕€程不安全的API
3赵誓、每一個(gè)線程都對(duì)應(yīng)一個(gè)runLoop打毛,但是只有主線程中的runLoop是開啟的。所以在一個(gè)單獨(dú)的線程中俩功,如果讓線程在處理完任務(wù)后不退出幻枉,而是繼續(xù)等待接收任務(wù),則需要手動(dòng)開啟runLoop
4诡蜓、runLoop主要有四個(gè)作用:使程序一直運(yùn)行熬甫,接收用戶輸入;決定程序在何時(shí)應(yīng)該處理哪些Event;調(diào)用解耦蔓罚,降低各模塊間的依賴椿肩,提高重用瞻颂;節(jié)省CPU的時(shí)間
5、NSRunLoop提供了一個(gè)添加NSTimer的方法郑象,可以指定Mode,如果要讓任何情況下都回調(diào)timer,則需要設(shè)置Mode為Common模式贡这。
6、runloop 是要和線程有更多的交互的時(shí)候才需要厂榛,比如說:
使用端口或自定義輸入源來和其他線程進(jìn)行通信盖矫;使用線程的定時(shí)器;Cocoa中使用任何延時(shí)調(diào)用performSelector的方法噪沙;使線程周期性工作炼彪。
7、runLoop的重要點(diǎn):
>1.Cocoa中的NSRunLoop類并不是線程安全的正歼,就是說不能在一個(gè)線程中去操作另一個(gè)線程的runLoop對(duì)象,但是CoreFundation中的CFRunLoopRef是線程安全的拷橘,而且兩種類型的run loop是可以混用的局义。NSRunLoop類可以直接通過實(shí)例方法- (CFRunLoopRef)getCFRunLoop;來獲取對(duì)應(yīng)的CFRunLoopRef類,來帶到線程安全的目的
>2.run loop的管理并不完全是自動(dòng)的冗疮。仍需要設(shè)計(jì)線程代碼在適當(dāng)?shù)臅r(shí)候啟動(dòng)run loop并使用while/for語句來驅(qū)動(dòng)run loop能循環(huán)運(yùn)行
>3.run loop 同時(shí)也負(fù)責(zé)autorelease pool的創(chuàng)建的釋放萄唇。在使用MRC時(shí),經(jīng)常會(huì)使用自動(dòng)釋放對(duì)象术幔,而如果這些對(duì)象不能及時(shí)釋放的話另萤,就會(huì)使內(nèi)存占有量急劇增大。在runloop中诅挑,每當(dāng)一個(gè)運(yùn)行循環(huán)結(jié)束的時(shí)候四敞,它都會(huì)釋放一次autorelease pool,同時(shí)pool中的所有自動(dòng)釋放類型都會(huì)被釋放掉拔妥。