- 在启动优化中已经有个使用经历了,项目中就是用来获取缺页中断(Page In)个数和时间,通过二进制重排来做启动优化的
帮助我们分析代码/方法的执行时间,找出程序变慢的原因,告诉我们那些方法使用时间较多,可以进行响相应的优化
-
设置编译条件
(1)必须真机调试 (2)Release模式下: 因为会开启编译器优化提高代码运行效率 (3)设置Debug Information Format -> DWARF with dSYM File开启调试符号,即dsym格式文件 -
打开Time Profiler工具,然后Xcode运行项目同时点击Instruments工具中的录制/暂停按钮
(1)选中Time Profiler、选中Profile (2)Call Tree选项中 勾选 Separate by Thread Hide systerm Libraries Invert call tree (3)Call Tree Constraints 中Min 选择2 表示过滤掉2ms秒以下的调用堆栈信息 -
通过截图上面的内容我们可以发现哪些方法调用比较耗时,然后进行相应的优化
- 分析内存泄漏问题。它会监测应用程序的内存分配和释放情况,并标记出可能存在的内存泄漏点
- 监测应用程序的内存分配情况。通过查看对象的生命周期和内存使用情况,可以找到潜在的内存泄漏问题,并进行优化
-(void)viewDidLoad {
[super viewDidLoad];
[NSThread sleepForTimeInterval:3.0];
__unsafe_unretained NSMutableArray *arr = [[NSMutableArray alloc]init];
[arr addObject:@12];
}
-
注意这里只要点击了红色的录制Record按钮,就能直接让项目运行起来
-
野指针: 指指向一个已被释放或者未被初始化的内存地址的指针; 野指针产生的原因:
(1)指针变量未初始化 声明指针变量后,若没有给它赋一个有效的初始值,它会默认指向一个随机的内存地址,这个地址可能是无效或者不应该被访问的 (2)对象释放后指针未置为 nil 当一个对象被释放后,如果没有将指向该对象的指针设置为nil,那么这个指针就成为了野指针 (3)指针越界访问 访问数组或其他数据结构时,若指针的索引超出了有效的范围,可能导致指针指向了不属于该数据结构的内存区域,从而成为野指针 危害:野指针访问内存时,可能会导致程序直接崩溃,出现EXC_BAD_ACCESS错误。也可能会意外地修改其他变量或数据结构的值 -
僵尸对象: 是指已经被释放的对象,但由于某种原因,仍然有指针指向它,导致程序在后续操作中可能会向这个已经释放的对象发送消息
(1)多指针指向同一对象 当多个指针指向同一个对象时,若其中一个指针释放了该对象而其他指针没有及时更新,就可能导致这些指针成为指向僵尸对象的指针 (2)对象在回调或异步操作中被释放 在一些异步操作或回调函数中,若对象在操作完成之前被释放,而操作完成后又尝试通过原来的指针访问该对象,就会产生僵尸对象问题 -
僵尸对象和野指针的区别:
野指针本质上是指针指向了不确定或无效的内存地址,它可能从未指向过一个有效的对象,或者指向的对象已经被释放且指针未被正确处理 僵尸对象则是一个曾经有效的对象被释放后,仍然有指针指向它,它是一个已经死亡但还存在引用的对象 野指针访问内存时通常会立即引发EXC_BAD_ACCESS错误,因为它指向的地址很可能是不合法的 僵尸对象在某些情况下可能不会立即引发错误,因为系统可能会暂时保留一些与僵尸对象相关的信息,使得向它发送消息时可能 不会马上崩溃,但这种行为是不可靠和不确定的,最终也可能导致程序崩溃或出现数据损坏等问题

