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 的伤害就更大了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值