卡顿优化
卡顿优化 - 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
耗电优化
- 尽可能
降低CPU、GPU功耗少用定时器优化I/O操作
- 尽量
不要频繁写入小数据,最好批量一次性写入读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问- 数据量比较大的,建议
使用数据库(比如SQLite、CoreData)
网络优化
减少、压缩网络数据- 如果多次请求的结果是相同的,尽量
使用缓存- 使用
断点续传,否则网络不稳定时可能多次传输相同的内容网络不可用时,不要尝试执行网络请求- 让用户可以取消长时间运行或者速度很慢的网络操作,
设置合适的超时时间批量传输,比如,下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一次性多下载一些,然后再慢慢展示。如果下载电子邮件,一次下载多封,不要一封一封地下载
定位优化
- 如果只是需要快速确定用户位置,最好用
CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电- 如果不是导航应用,尽量
不要实时更新位置,定位完毕就关掉定位服务- 尽量
降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest- 需要后台定位时,尽量设置pausesLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动
暂停位置更新- 尽量不要使用startMonitoringSignificantLocationChanges,优先考虑
startMonitoringForRegion:
硬件检测优化用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件
APP启动
APP启动优化
- dyld
减少动态库、合并一些动态库(定期清理不必要的动态库)减少Objc类、分类的数量、减少Selector数量(定期清理不必要的类、分类)减少C++虚函数数量Swift尽量使用struct
- runtime
用
+initialize方法和dispatch_once取代所有的__attribute__((constructor))、C++静态构造器、ObjC的+load
- main
- 在不影响用户体验的前提下,尽可能
将一些操作延迟,不要全部都放在finishLaunching方法中按需加载
安装包瘦身
安装包优化
- 资源:图片、音频、视频
去除没有用到的资源,无损压缩- 可执行文件瘦身
- 编译器优化
- 检测未使用的代码:菜单栏 -> Code -> Inspect Code
- 检测出重复代码、未被调用的代码
iOS开发中遇到的问题,以及常见的问题解决办法
iOS开发工作中会遇到多种问题,以下是一些常见问题及其解决方法:
一、兼容性问题
iOS生态系统涵盖多种设备和iOS版本,这可能导致应用在不同设备上的兼容性问题。
- 解决方法:使用
自适应设计和响应式布局来确保应用在不同设备上良好运行。定期更新应用以支持最新的iOS版本,并使用测试工具来检测问题。
二、性能问题
性能问题可能导致应用卡顿或崩溃,影响用户体验。
- 解决方法:使用性能分析工具来检测性能瓶颈,并优化代码、图形和资源以提高应用的响应速度。确保合理使用内存和处理器资源。
三、安全性和隐私保护
苹果严格监管应用的安全性和隐私,开发人员必须遵循苹果的安全和隐私政策。
- 解决方法:遵守苹果的安全性和隐私要求,包括数据加密、用户数据保护和权限请求。确保应用中不包含恶意代码或漏洞。
四、App Store审核问题
苹果对在App Store上发布的应用进行审查,可能会导致应用被拒绝或需要多次修改。
- 解决方法:仔细阅读苹果的App Store审核指南,确保应用符合规定。准备好满足苹果的审核要求,包括适当的内容和隐私政策。
五、第三方库和工具的使用问题
使用第三方库和工具时可能会面临兼容性和集成问题。
- 解决方法:定期更新第三方库,以确保与最新版本的iOS兼容。测试集成,查找并解决与其他库或工具的冲突。
六、本地化问题
多语言支持可能导致本地化问题,如 文本截断或排版错误 。
- 解决方法:使用自动布局和支持多语言的工具来处理本地化问题。进行本地化测试以确保文本适合不同语言。
七、客户支持问题
用户可能遇到问题或提出反馈,需要提供良好的客户支持。
- 解决方法:建立客户支持渠道,回应用户反馈并解决问题。定期发布应用更新以修复错误和改进功能。
八、市场竞争问题
App Store上有数百万的应用,竞争激烈,如何突出自己是一个挑战。
- 解决方法:通过市场调研了解竞争对手,提供独特的价值主张和功能。积极参与营销和用户获取活动。
九、具体技术问题及解决方案
-
storyboard连线问题:将与storyboard关联的属性删除了,但是storyboard中还保持之前所关联的属性。- 解决方法:点击view controller,点击这排最后一个按钮,找到并点击感叹号左边的x,取消关联。
-
文本框中输入的内容密文显示。- 解决方法:勾选secure属性。
-
iOS真机测试错误:“The application bundle does not contain a valid identifier”。- 解决方法:尝试使用快捷键command+alt+shift+k重新运行代码,或在Xcode的Preferences中的Locations下找到Derived Data的路径,删除Derived Data下的所有文件。
-
UIScrollView中嵌套UITableview,IQKeyboardManagerSwift对cell中的输入框UITextfield失效。- 解决方法:将
tableView的滑动关闭,即设置tableView.isScrollEnabled = NO。
- 解决方法:将
-
缺少系统库:报错信息提示缺少libstdc++.dylib、MobileCoreServices.framework、SystemConfiguration.framework或libxml2.2.tbd等系统库。- 解决方法:在Xcode的项目的Build Phases中添加对应的库。
-
ARC与MRC混用问题:在使用了ARC的项目中复用以前写过的使用MRC的类时会出现报错。- 解决方法:在targets的build phases选项下的Compile Sources中选择不使用arc编译的文件,双击它并输入
-fno-objc-arc即可。对于MRC工程中要使用ARC的类,同样在Compile Sources中选择要使用arc编译的文件,双击并输入-fobjc-arc。
- 解决方法:在targets的build phases选项下的Compile Sources中选择不使用arc编译的文件,双击它并输入
-
App installation failed:真机测试过程中出现此错误,通常是因为手机中已经安装了相同的应用。
- 解决方法:删除手机中的这款APP,然后重新运行。
-
failed to get the task for process XXX:证书问题,project和targets的证书都必须是开发证书,ADHOC的证书会出现此问题。
- 解决方法:将project和targets的证书都更改为开发证书。
-
xib连线报错:报NSUnknownKeyException错误,通常是因为xib控件连线错误或Custom Class设置错误。- 解决方法:检查xib中的控件连线以及Custom Class的设置。
综上所述,iOS开发工作中遇到的问题多种多样,但大多数问题都有相应的解决方法。开发人员需要不断学习和适应新的技术和工具,同时注重用户体验和质量,遵守苹果的政策和要求,才能成功开发出优秀的iOS应用。