1. 程式人生 > >IOS 知識點總結(一)

IOS 知識點總結(一)

###IOS執行緒講解

  • 對於單核的處理器,可以把多個操作放到不同的執行緒,當用戶操作完UI之後其他後續任務在其他執行緒操作,當CPU空閒時繼續其他操作;
  • 對於多核操作,操作任務可以分散到多個空閒的CPU中繼續執行;
  • 一個核(CPU)可以有多個執行緒,但其實是CPU在快速的排程不同的任務,造成多執行緒執行的假象;
  • 每一個執行緒同時只能處理一件事情,其他的事情會放在佇列中等待,當CPU空閒時在接著執行佇列中的其他任務;
  • 每個APP的啟動就是一個程序,每一個程序會有一個主執行緒(更新UI呈現),這個執行緒是其他執行緒的父執行緒;
  • 啟動一個執行緒時,並非就一定立即執行,而是處於就緒狀態,當系統CPU根據當前狀態排程時才真正執行
  • 每開闢一個執行緒就需要佔用系統的開銷;

####1.執行緒操作的種類:

  • NSthread:

輕量級的多執行緒,需要開發者自己來管理執行緒的生命週期,由於NSthread需要開發者自動管理生命週期,一般情況下,會放到自動緩衝池中:@autoreleasepool。 當在多個執行緒使用時,執行緒順序不可控,只能通過調整執行緒的優先順序(0-1),預設的優先順序是0.5;

  • NSOperation:

該類不能直接使用,只能使用其自類:NSInvocationOperation和NSBlockOperation以及使用NSOperationQueue這個佇列中,建立好之後需要放到NSOperationQueue建立好的佇列中去; 比較容易管理執行緒總數以及執行緒的順序; 使用NSOperation進行多執行緒開發可以設定最大的併發數; 可以設定依賴執行緒,被依賴的執行緒會優先執行; NSOperation是對GCD的OC封裝,但是相比於GCD基於C語言開發,效率更高,所以一般建議如果任務之間有依賴關係或者想監聽任務的完成是會優先選擇NSoperation;

  • GCD(Grand Central Dispatch):

基於C語言封裝的面向過程的執行緒操作; GCD統一管理佇列中的任務,佇列分為序列佇列和並行佇列。 1.序列佇列:只有一個執行緒,所有任務按順序執行; 2.併發佇列:有多個執行緒,根據核數決定任務的執行速度,同時保證佇列的特性,先進先出; 3.主佇列:主要用於處理UI操作; 在GCD中一個操作是多執行緒還是 單執行緒取決於當前佇列的型別和執行方法,只有為並行佇列並且使用非同步是才能在多個執行緒中執行; GCD中不需要增加@autoreleasepool,GCD會自己管理記憶體; 順序的控制的話可以使用鎖或者訊號量操作;

  • 解決資源搶佔

使用同步鎖:NSlock和@Synchronized,可以再鎖未開啟之前不允許其他操作; GCD引用訊號量 初始化的訊號量必須大於0,每傳送一個通知,訊號量加1,每傳送一個等待訊號,訊號量減1,如果訊號量為0則訊號會處於等待狀態,知道訊號量大於0開始執行;

  • NSCondition:控制執行緒通訊

NSCondition主要用於解決執行緒之間的排程關係,可以使用wait方法控制某個執行緒處於等待狀態,知道其他執行緒呼叫signal(喚醒一個執行緒,如果有多個則喚醒任意一個)或者broadcast(此方法會喚醒所有的等待執行緒),方法喚醒該執行緒才能繼續; 1.GCD的任務: 同步:在當前執行緒中依次執行任務; 非同步:新開執行緒在新執行緒中執行任務; 2.GCD佇列: 序列佇列:讓任務有序的執行,同時只能排程一個任務執行; 並行佇列:可以讓多個任務併發、同時執行,可以同時排程多個任務執行;

  • 總結 1.執行緒安全問題:資源共享造成的安全問題,多個執行緒同時操作共享資源,會造成資料的錯亂,在這種情況下一般會選擇採用鎖機制來處理該問題; 2.執行緒同步:使多個執行緒一次有序的執行,就是上面的加鎖機制,把共享資源的讀寫操作鎖起來常用的是互斥鎖; 3.執行緒間的同步:一個執行緒執行完任務之後,把執行的結果傳遞到另外一個執行緒,叫執行緒間通訊。這裡寫圖片描述