要说发现问题 从程序crash开始 ,程序有时会发生系统捕捉不到的信号异常。
比较常见的是:
Signal 11 was raised. SIGSEGV
Signal 6 was raised. SIGABRT
这两个异常一个是释放已释放的内存,一个是使用了无效内存。看过这两个问题的解释后,我就开始觉得是内存泄漏的问题。
首先第一步,我使用最直白的方法
- (void)dealloc{
NSLog(@"%@---dealloc",[self class]);
}
dealloc打印 在ViewController的基类里加入以上打印,这样vc释放的时候就能够看到了,对项目进行检查,看那个Controller释放的时候没有打印,就可以锁定到哪些Controller有问题。再对Controller进行逐一检查,锁定问题。常见的问题有
问题一:
@interface HeadImgPickerView :UIView
@property(nonatomic,strong)UIViewController * controller;
@property (nonatomic, strong) id delegate;
- (instancetype)initWithViewController:(UIViewController *)vc;
-(void)show;
@end
delegate使用强引用,这里的delegate,controller都用该使用weak不然就会循环引用。
问题二:block 导致的计数+1无法回收
[alert addButton:Button_OTHER withTitle:@"相册" handler:^(RoadAlertDialogItem *item) {
[self dosomething];
}];
block里引用block外的变量一定要进行weak处理,通常方式block内丢失还会在内部strong处理一下。
@WeakObj(self)
[alert addButton:Button_OTHER withTitle: @"相册" handler:^(RoadAlertDialogItem *item) {
@StrongObj(self)
[self dosomething];
}];
注:这里附上我的两个宏
#define WeakObj(o) try{}@finally{} __weak typeof(o) o##Weak = o;
#define StrongObj(o) try{}@finally{} __strong typeof(o) o = o##Weak;
通过排查,处理了这两类问题基本上表面上的泄漏就差不多了。
下面使用xcode自带的工具检测一下,我就不再细说了。见推荐阅读