关于性能优化这块,我不喜欢长篇大论。根据个人经验,我主要总结了下面的几点:
1. 要分清楚内存的几块区域,他们具备的特征,而不是记概念
官方文档地址: https://developer.apple.com/library/archive/navigation/
详细方法https://developer.apple.com 点击Document,进入后点击Documentation Archive
内存五大区:
栈区: 函数参数,局部变量(压栈,高到低)
堆区:alloc new, mrc需要手动释放,release, (堆上去的,低到高)
BSS(全局区)(静态区),单例变量,static, 常驻内存,程序退出后系统释放
常量区 profixheader中的宏,枚举,kvo,runtime常量等, 常驻内存,程序退出后系统释放
程序代码区
栈: 压栈,从高到低 连续(每个int相差4个字节,指针8个字节) 栈地址 7开头的
堆: 堆起来, 从低到高,不连续(每个指针相差不是固定的8个字节),堆地址 6开头的
堆区的访问速度没有栈区快,因为要先从栈里面取出堆的地址,再取出值. obj -> &obj1
大小不知道的可以,引入 #import <objc/runtime.h> 使用class_getInstanceSize(变量名)打印。
NSLog(@"%zd",class_getInstanceSize([obj class]));//8
补充:TagPointer: 概念省略
2. UI卡顿原因,检测工具,常用的库
3. 内存问题的检测方法
4.应用瘦身的方法,譬如常用的图片无损压缩,linkMap
5.个人项目中遇到的内存问题。
6.多线程的优化,以及如何避坑
01-UI部分
03-OC语言 KVC KVO 分类 关联对象 扩展 代理 属性关键字
04- runtime runloop
主要从实操角度,切入点分析,不是死记硬背。例如runtime消息打印的msgSend文件内容是什么,为什么会有object_setClass,method_setImplementation两种不同的方法; 什么情况会用到动态方法解析,什么时候用消息发送消息转发.runloop循环等待实现休眠