ios开发细节问题

一、在iOS开发中,为什么UI操作必须放在主线程中?

  • UIKit是一个线程不安全的类,UI操作涉及到渲染访问各种View对象的属性,如果异步操作下会存在读写问题,而为其加锁则会耗费大量资源并拖慢运行速度。
  • 因为整个程序的起点UIApplication是在主线程进行初始化,所有的用户事件都是在主线程上进行传递(如点击、拖动),所以view只能在主线程上才能对事件进行响应。
  • 帧率方面:而在渲染方面由于图像的渲染需要以60帧的刷新率在屏幕上同时更新,在非主线程异步化的情况下无法确定这个处理过程能够实现同步更新。

UIKit线程不安全

在UIKit中,很多类中大部分的属性都被修饰为nonatomic,这意味着它们不能在多线程的环境下工作,而对于UIKit这样一个庞大的框架,将其所有属性都设计为线程安全是不现实的,这可不仅仅是简单的将nonatomic改成atomic或者是加锁解锁的操作,还涉及到很多的方面。比如:假设UITableView在其他线程去移除了一个cell,而在另一个线程却对这个cell所在的index进行一些操作,这时候可能就会引发crash。

Runloop 与绘图循环

UIApplication在主线程所初始化的Runloop我们称为Main Runloop,它负责处理app存活期间的大部分事件,如用户交互等,它一直处于不断处理事件和休眠的循环之中,以确保能尽快的将用户事件传递给GPU进行渲染,使用户行为能够得到响应,画面之所以能够得到不断刷新也是因为Main Runloop在驱动着。

ios渲染流程

  • UIKit: 包含各种控件,负责对用户操作事件的响应,本身并不提供渲染的能力
  • Core Animation: 负责所有视图的绘制、显示与动画效果
  • OpenGL ES: 提供2D与3D渲染服务
  • Core Graphics: 提供2D渲染服务
  • Graphics Hardware: 指GPU

在iOS中,所有视图的现实与动画本质上是由 Core Animation 负责,而不是UIKit。

二、在for循环里一次性执行1000个异步任务有问题吗?

1.资源暂用问题分析

内存占用方面:

  • 当在for循环中一次性执行 1000 个异步任务时,每个异步任务可能会占用一定的内存资源。这些资源包括但不限于任务相关的变量、数据结构以及可能涉及的缓存等。如果这些任务没有得到有效的管理,可能会导致内存峰值过高。例如,如果每个任务都需要加载一定量的数据到内存中,1000 个任务同时进行这样的操作可能会耗尽设备的内存,从而导致应用程序崩溃。

CPU 和网络资源方面

  • 从 CPU 资源的角度来看,大量的异步任务同时执行可能会使 CPU 使用率瞬间飙升。这会导致设备发热、电池消耗加快,并且可能会影响其他正在运行的应用程序或者系统服务。特别是当这些异步任务包含复杂的计算逻辑时,情况会更加严重。
  • 在涉及网络请求的异步任务场景下,1000 个并发的网络请求可能会对网络带宽造成巨大压力。这不仅可能导致当前应用的网络请求变慢,还可能会影响同一网络环境下的其他设备的网络性能。并且,服务器端可能会因为收到过多请求而拒绝服务或者限制访问,增加请求失败的概率。
     

2.执行效率问题

  • 过多的异步任务同时执行可能会导致线程切换过于频繁。操作系统需要在这些任务对应的线程之间进行调度,这会产生额外的开销。例如,当线程切换时,需要保存当前线程的执行状态,加载下一个线程的执行状态等操作,这些操作会消耗时间和系统资源,从而降低整体的执行效率。
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值