iOS之性能优化面试题三

173 阅读3分钟

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

高级

  1. 加速启动时间。快速打开app是很重要的,特别是用户第一次打开它时,对app来讲,第一印象太太太重要了。你能做的就是使它尽可能做更多的异步任务,比如加载远端或者数据库数据,解析数据。比main过于庞大的XIB,因为它们是在主线程加载的,所以尽量使用没有这个问题的Storyboards吧!一定要把设备从Xcode断开来测试启动速度。
  2. 使用Autorelease Pool。NSAutoreleasePool负责释放block中的autoreleased objects。一帮情况下它会自动被UIKit调用,但是有些状况下你也需要手动去创建它。假如你创建很多临时对象,你会发现内存一直在减少直到这些对象被release的时候,这是因为只有当UIKit用光了autorelease pool的时候memory才会被释放。你可以在你自己的@autoreleasepool里创建临时的对象来避免这个行为。
  3. 选择是否缓存图片。常见的从bundle中加载图片的方式有两种,一个是用imageNamed,二是用imageWithContentsOfFile,第一种比较常见一点。
  4. 避免日期格式转换。如果你要用 NSDateFormatter 来处理很多日期格式,应该小心以待。就像先前提 到的,任何时候重用 NSDateFormatters 都是一个好的实践。如果你可以控制你所处理的日期格式,尽量 选择 Unix 时间戳。你可以方便地从时间戳转换到 NSDate:
- (NSDate *)dateFromUnixTimestamp:(NSTimeInterval)timestamp{
    return [NSDate dateWithTimeintervalSince1970:timestamp];
}

这样会比用 C 来解析日期字符串还快!需要注意的是,许多 web API 会以微秒 的形式返回时间戳,因为这种格式在 javascript 中更方便使用。记住用 dateFromUnixTimestamp 之前除以 1000 就好了。 光栅化 5. 平时你是如何对代码进行性能优化的? - 利用性能分析工具检测,包括静态 Analyze 工具,以及运行时 Profile 工具,通过 Xcode 工具栏中 Product->Profile 可以启动, - 比如测试程序启动运行时间,当点击TimeProfiler应用程序开始运行后.就能获取到整个应用程序运 行消耗时间分布和百分比.为了保证数据分析在统一使用场景真实需要注意一定要使用真机,因为此时 模拟器是运行在 Mac 上,而 Mac 上的 CPU 往往比 iOS 设备要快。 - 为了防止一个应用占用过多的系统资源,开发iOS的苹果工程师门设计了一个“看门狗”的机制。在不 同的场景下,“看门狗”会监测应用的性能。如果超出了该场景所规定的运行时间,“看门狗”就会强制 终结这个应用的进程。开发者们在 crashlog 里面,会看到诸如 0x8badf00d 这样的错误代码。 6. 优化TableView - 正确使用reuseIdentifier来重用cells - 尽量使所有的viewopaque,包括cell自身 - 如果cell内现实的内容来自web,使用异步加载,缓存请求结果 ,减少 subviews 的数量 - 尽量不适用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果 - 使用rowHeight,sectionFooterHeight和sectionHeaderHeight来设定固定的高,不要请求delegate

  1. 光栅化。光栅化是将几何数据经过一系列变换后最终转换为像素,从而呈现在显示设备上 的过程,光栅化的本质是坐标变换、几何离散化。我们使用 UITableView 和 UICollectionView 时经常会遇到各个 Cell 的样式 是一样的,这时候我们可以使用这个属性提高性能:
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [[UIScreen mainScreen] scale];