IOS 多线程 常驻线程,并发,内存问题
一、常駐線程
001 常駐線程指的是那些一直存在于內存的線程。
002 通過NSRunloop添加runloop的方法有:
run方法。通過run方法添加runloop,會不斷重復調用runModel:beforeDate:方法來確保自己不會停止
runUntilDate和runModel:beforeDate:可以通過指定時間來停止runloop
003 如果每個庫都通過一個常駐線程這樣做不但不能提高CPU的利用率反而會降低執行效率,
004 解決方案:可以選擇使用 NSRunLoop 的另外兩個方法 runUntilDate: 和 runMode:beforeDate,來指定線程的保活時長。讓線程存活時間可預期,總比讓線程常駐,至少在硬件資源利用率這點上要更加合理。或者,你還可以使用 CFRunLoopRef 的 CFRunLoopRun 和 CFRunLoopStop 方法來完成 runloop 的開啟和停止,達到將線程保活一段時間的目的。
二、并發
?001?GCD(Grand Central Dispatch)是由蘋果公司開發的一個多核編程解決方案。它提供的一套簡單易用的接口,極大地方便了并發編程。同時,它還可以完成對復雜的線程創建、釋放時機的管理。
002 在類似于數據存儲這樣需要等待磁盤響應的任務的場景,隨著任務數量增加,GCD創建的新線程會越來越多,從而導致內存資源越來越緊張;
等到磁盤開始響應后再讀取數據會占用更多內存結果會引發內存問題
003 解決方案:并行隊列轉化為串行隊列來執行,避免大并發讀寫磁盤操作造成內存問題
三、內存問題
新建一個線程,系統還需要為這個進程空間分配一定的內存作為線程堆棧。堆棧大小是 4KB 的倍數。在 iOS 開發中,主線程堆棧大小是 1MB,新創建的子線程堆棧大小是 512KB。除了內存開銷外,線程創建得多了,CPU 在切換線程上下文時,還會更新寄存器,更新寄存器的時候需要尋址,而尋址的過程還會有較大的 CPU 消耗。所以,線程過多時內存和 CPU 都會有大量的消耗,從而導致 App 整體性能降低,使得用戶體驗變成差。CPU 和內存的使用超出系統限制時,甚至會造成系統強殺。這種情況對用戶和 App 的傷害就更大了。
總結
以上是生活随笔為你收集整理的IOS 多线程 常驻线程,并发,内存问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北邮计算机学院孙岩,孙岩(博导)-北京邮
- 下一篇: 怎样把LoRa模块功耗降到极致