一,了解性能优化的点;
1)(main函数执行之前)启动速度测量:Product->schema-editSchema 里面添加一个DYLD_PRINT_STATISTICS 1
2)main 函数执行的实践
12)的优化
减少动态库加载
减少类数量
Main函数不要太多耗时操作
3)循环引用:堆
堆,栈,静态区。
获取引用计数:CFGetRetainCount/ valueForkey retainCount
block weakSelf, StrongSelf 使用场景?
野指针:可以开启僵死对象调试
assign 和 weak 区别,assign修饰的对象回收时不会置空,有可能有野指针情况,weak 则会。
检查内存泄漏的方法:
1,静态检测
- 手动开启静态检测:product - analysing
2)开启自动检测:target- > buildSetting- > analyze during build 设置一下。
2,动态检测instrument, 第三方内存检测工具(MleaksFinder:只检测试图)
3,打印析构
ARC。CG类,c方法, CF类手动释放
4)内存检测的原理
Method Swizzling 方法交换
@seletor(test:) 下面两个方法是不能共存的。
- (void)test:(BOOL )b;
-(void)test:(NSString *)a;
下面这两个就可以,因为存在不同的地方。
- (void)test:(BOOL )b; 类对象
+(void)test:(NSString *)a; 元类对象
如何写一个工具:
目标:检测试图控制器是否内存泄漏
思路:我们在控制器弹出消失的时候,监听对象是否还活着
知识点:
load:不会覆盖,各个类都有自己的load方法
initialize: 懒加载的时候调用,类触发的时候
所以方法交换应该在load 方法里面。可以查看自己的代码。LeakCheckingDemo!!!!!
二,如何应用到我的实践中;
LeakCheckingDemo
思路:在控制器pop出去的时候,设置一个值pop为YES,然后在viewdidappear的时候取出这个值,如果为YES(pop过了)那么就延迟去检查self 是否为空,不为空就调用去打印
网友评论