性能优化

作者 : 开心源码 本文共1135个字,预计阅读时间需要3分钟 发布时间: 2022-05-13 共271人阅读

循环问题

例如NSTimer,注册了runloop,NSTimer持有self,runloop和线程逐个对应,主线程不退出,self没法回收,导致循环引用。
处理:
1:通过timer含有block的函数方法,来创立timer,并配合weak,strong进行操作。
2:通过中间者,创立实例对象(例如创立一个继承NSProxy的实例对象),在该文件中,公告属性(被weak修饰),作为目标执行者通过
-(NSMethodSignature*)methodSignatureForSelector:(SEL)sel{ }-(void)forwardInvocation:(NSInvocation *)invocation{ }来传递target来执行方法操作。
外部则通过strong来修饰这个实例对象,当timer正常释放销毁时,析构函数被调用,弱引用表被清空,不会造成额外的持有。
3:创立一个NSobject类型的对象,对象调用addMethod方法来动态增加方法,去改变转发原有要执行的操作方法。

注:weak的操作要慎用。在处理循环引用的时候使用。由于weak在执行时,底层调用的是objc_initWeak函数,接着store_weak,会涉及到weak_register,通过hash运算,放到weak_table表中,key:当前对象的地址,value:对象被weak的所有地址。当对象被释放时,会调用weak_unregister,循环遍历弱引用表,将所有对象被weak的指针置位nil。相对消耗性能。

界面优化

能异步操作异步操作,将界面UI分解成小任务。

界面卡慢的起因以及对应解决
1:有耗时操作:文本计算,大量图片绘制,高清图——放子线程操作;
2:CGD短时间内创立大量任务——使用线程池处理(事前创立若干可执行的线程放入一个池中,需要的时候,从线程池中获取线程不用自行创立,使用完毕不需要销毁线程,直接放回池中,减少了创立和销毁线程对象的开销)

滑动优化可从CPU,GPU层面考虑:

CPU:对象创立,销毁;预排版(布局计算–);预渲染(文本等异步绘制,图片编解码等等)子线程操作,减少CPU时间消耗
GPU:纹理渲染,避免离屏渲染(GPU在当前屏缓冲区以外新开拓一个缓冲区进行渲染操作。添加GPU的工作量,导致CPU+GPU的工作量之和超时,造成卡慢 。);通过CPU异步绘制,减轻GPU压力;减轻视图层级的复杂性。

内存泄漏

除使用工具外,可通过代码检测,在视图生命周期结束时,推迟发送一个消息,可通过响应返回的值的情况去判断内容能否都被释放。

NSLog(@"方法响应,有返回值说明有可能造成了内存泄露%@",NSStringFromClass([self class]));

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 性能优化

发表回复