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.線程間的同步:一個線程執行完任務之後,把執行的結果傳遞到另外一個線程,叫線程間通信。這裏寫圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章