Runloop 相關(guān)
Runloop 保持線程能隨時處理事件而不退出
深入理解Runloop
- 線程和Runloop 的關(guān)系
線程和 RunLoop 之間是一一對應(yīng)的凑术,其關(guān)系是保存在一個全局的 Dictionary 里。線程剛創(chuàng)建時并沒有 RunLoop椅棺,如果你不主動獲取,那它一直都不會有定庵。RunLoop 的創(chuàng)建是發(fā)生在第一次獲取時西篓,RunLoop 的銷毀是發(fā)生在線程結(jié)束時。你只能在一個線程的內(nèi)部獲取其 RunLoop(主線程除外) - 一個 RunLoop 包含若干個 Mode炉爆,每個 Mode 又包含若干個 Source/Timer/Observer堕虹。每次調(diào)用 RunLoop 的主函數(shù)時,只能指定其中一個 Mode芬首,這個Mode被稱作 CurrentMode赴捞。如果需要切換 Mode,只能退出 Loop郁稍,再重新指定一個 Mode 進入赦政。這樣做主要是為了分隔開不同組的 Source/Timer/Observer鬼雀,讓其互不影響硅则。
RunLoop_0.png
- Source/Timer/Observer 被統(tǒng)稱為 mode item生音,一個 item 可以被同時加入多個 mode源祈。但一個 item 被重復(fù)加入同一個 mode 時是不會有效果的赊锚。如果一個 mode 中一個 item 都沒有笛厦,則 RunLoop 會直接退出维费,不進入循環(huán)
鎖相關(guān)
@synchronized
- 傳入@synchronized的參數(shù)和這個鎖有什么關(guān)系种蝶?
- @synchronized是否持有它所加鎖的對象左痢?
- 如果傳入@synchronized代碼塊的對象在代碼塊里被析構(gòu)了或者被置為nil了會怎么樣靡羡?
解答:
- 對于每個加了同步的對象系洛,`Objective-C的運行時都會給其分配一個遞歸鎖,并且保存在一個哈希表中亿眠。
- 一個被加了同步的對象被析構(gòu)活著被置為nil都是沒有問題的碎罚。然而文檔中并沒有對此進行什么說明
- 注意不要往@synchronized代碼塊中傳入nil!這會毀掉代碼的線程安全性纳像。通過往objc_sync_nil加入斷點你可以看到這種情況的發(fā)生荆烈。
@synchronized代碼塊隱式地給被保護的代碼段添加了一個異常處理塊。這就是為什么在給某個對象保持同步的時候竟趾,如果拋出了異常憔购,鎖就會被釋放。
遞歸鎖岔帽,是一種在已持有鎖的線程重復(fù)請求鎖卻不會發(fā)生死鎖的鎖玫鸟。你可以在這里找到一個相關(guān)的例子。有個很好用的類NSRecursiveLock
優(yōu)化相關(guān)
待看
[淺談Block] (http://www.reibang.com/p/f9956b102d36)
[淺談Clang] (http://www.reibang.com/p/9fc7776cce9b)