OC面试题 七、性能优化

275 阅读8分钟

卡顿优化

卡顿优化 - CPU

  • 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
  • 不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
  • 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
  • Autolayout会比直接设置frame消耗更多的CPU资源
  • 图片的size最好刚好跟UIImageView的size保持一致
  • 控制一下线程的最大并发数量
  • 尽量把耗时的操作放到子线程(文本处理(尺寸计算、绘制)图片处理(解码、绘制))

卡顿优化 - GPU

  • 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
  • GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
  • 尽量减少视图数量和层次
  • 减少透明的视图(alpha<1),不透明的就设置opaque为YES
  • 尽量避免出现离屏渲染

离屏渲染

哪些操作会触发离屏渲染?

  • 光栅化,layer.shouldRasterize = YES
  • 遮罩,layer.mask
  • 圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0 考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片
  • 阴影,layer.shadowXXX 如果设置了layer.shadowPath就不会产生离屏渲染

卡顿检测

卡顿检测方法

  • 平时所说的“卡顿”主要是因为在主线程执行了比较耗时的操作
  • 可以添加Observer到主线程RunLoop中,通过监听RunLoop状态切换的耗时,以达到监控卡顿的目的

耗电监测

耗电的主要来源

  • CPU处理,Processing
  • 网络,Networking
  • 定位,Location
  • 图像,Graphics

耗电优化

  1. 尽可能降低CPU、GPU功耗
  2. 少用定时器
  3. 优化I/O操作
  • 尽量不要频繁写入小数据最好批量一次性写入
  • 读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问
  • 数据量比较大的,建议使用数据库(比如SQLite、CoreData)
  1. 网络优化
  • 减少、压缩网络数据
  • 如果多次请求的结果是相同的,尽量使用缓存
  • 使用断点续传,否则网络不稳定时可能多次传输相同的内容
  • 网络不可用时,不要尝试执行网络请求
  • 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间
  • 批量传输,比如,下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一次性多下载一些,然后再慢慢展示。如果下载电子邮件,一次下载多封,不要一封一封地下载
  1. 定位优化
  • 如果只是需要快速确定用户位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电
  • 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
  • 尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest
  • 需要后台定位时,尽量设置pausesLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新
  • 尽量不要使用startMonitoringSignificantLocationChanges,优先考虑startMonitoringForRegion:
  1. 硬件检测优化 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

APP启动

APP启动优化

  1. dyld
  • 减少动态库、合并一些动态库(定期清理不必要的动态库)
  • 减少Objc类、分类的数量减少Selector数量(定期清理不必要的类、分类)
  • 减少C++虚函数数量
  • Swift尽量使用struct
  1. runtime
  • +initialize方法和dispatch_once取代所有的__attribute__((constructor))、C++静态构造器、ObjC的+load

  1. main
  • 在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
  • 按需加载

安装包瘦身

安装包优化

  • 资源:图片、音频、视频去除没有用到的资源,无损压缩
  • 可执行文件瘦身
    • 编译器优化
    • 检测未使用的代码:菜单栏 -> Code -> Inspect Code
    • 检测出重复代码、未被调用的代码

iOS开发中遇到的问题,以及常见的问题解决办法

iOS开发工作中会遇到多种问题,以下是一些常见问题及其解决方法:

一、兼容性问题

iOS生态系统涵盖多种设备和iOS版本,这可能导致应用在不同设备上的兼容性问题。

  • 解决方法:使用 自适应设计和响应式布局 来确保应用在不同设备上良好运行。定期更新应用以支持最新的iOS版本,并使用测试工具来检测问题

二、性能问题

性能问题可能导致应用卡顿或崩溃,影响用户体验。

  • 解决方法:使用性能分析工具来检测性能瓶颈,并优化代码、图形和资源以提高应用的响应速度。确保合理使用内存和处理器资源。

三、安全性和隐私保护

苹果严格监管应用的安全性和隐私,开发人员必须遵循苹果的安全和隐私政策。

  • 解决方法:遵守苹果的安全性和隐私要求,包括数据加密、用户数据保护和权限请求。确保应用中不包含恶意代码或漏洞。

四、App Store审核问题

苹果对在App Store上发布的应用进行审查,可能会导致应用被拒绝或需要多次修改。

  • 解决方法:仔细阅读苹果的App Store审核指南,确保应用符合规定。准备好满足苹果的审核要求,包括适当的内容和隐私政策。

五、第三方库和工具的使用问题

使用第三方库和工具时可能会面临兼容性和集成问题。

  • 解决方法:定期更新第三方库,以确保与最新版本的iOS兼容。测试集成,查找并解决与其他库或工具的冲突。

六、本地化问题

多语言支持可能导致本地化问题,如 文本截断或排版错误

  • 解决方法:使用自动布局和支持多语言的工具来处理本地化问题。进行本地化测试以确保文本适合不同语言。

七、客户支持问题

用户可能遇到问题或提出反馈,需要提供良好的客户支持。

  • 解决方法:建立客户支持渠道,回应用户反馈并解决问题。定期发布应用更新以修复错误和改进功能。

八、市场竞争问题

App Store上有数百万的应用,竞争激烈,如何突出自己是一个挑战。

  • 解决方法:通过市场调研了解竞争对手,提供独特的价值主张和功能。积极参与营销和用户获取活动。

九、具体技术问题及解决方案

  1. storyboard连线问题:将与storyboard关联的属性删除了,但是storyboard中还保持之前所关联的属性。

    • 解决方法:点击view controller,点击这排最后一个按钮,找到并点击感叹号左边的x,取消关联。
  2. 文本框中输入的内容密文显示

    • 解决方法:勾选secure属性。
  3. iOS真机测试错误:“The application bundle does not contain a valid identifier”。

    • 解决方法:尝试使用快捷键command+alt+shift+k重新运行代码,或在Xcode的Preferences中的Locations下找到Derived Data的路径,删除Derived Data下的所有文件。
  4. UIScrollView中嵌套UITableview,IQKeyboardManagerSwift对cell中的输入框UITextfield失效

    • 解决方法:将 tableView的滑动关闭,即设置tableView.isScrollEnabled = NO
  5. 缺少系统库:报错信息提示缺少libstdc++.dylib、MobileCoreServices.framework、SystemConfiguration.framework或libxml2.2.tbd等系统库。

    • 解决方法:在Xcode的项目的Build Phases中添加对应的库。
  6. ARC与MRC混用问题:在使用了ARC的项目中复用以前写过的使用MRC的类时会出现报错。

    • 解决方法:在targets的build phases选项下的Compile Sources中选择不使用arc编译的文件,双击它并输入 -fno-objc-arc 即可。对于MRC工程中要使用ARC的类,同样在Compile Sources中选择要使用arc编译的文件,双击并输入-fobjc-arc。
  7. App installation failed:真机测试过程中出现此错误,通常是因为手机中已经安装了相同的应用。

    • 解决方法:删除手机中的这款APP,然后重新运行。
  8. failed to get the task for process XXX:证书问题,project和targets的证书都必须是开发证书,ADHOC的证书会出现此问题。

    • 解决方法:将project和targets的证书都更改为开发证书。
  9. xib连线报错:报NSUnknownKeyException错误,通常是因为xib控件连线错误或Custom Class设置错误。

    • 解决方法:检查xib中的控件连线以及Custom Class的设置。

综上所述,iOS开发工作中遇到的问题多种多样,但大多数问题都有相应的解决方法。开发人员需要不断学习和适应新的技术和工具,同时注重用户体验和质量,遵守苹果的政策和要求,才能成功开发出优秀的iOS应用。