iOS开发iOS内存泄露

ARC常见的内存泄漏修复

2016-06-06  本文已影响1141人  踩了个铺

要说发现问题 从程序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自带的工具检测一下,我就不再细说了。见推荐阅读


上一篇下一篇

猜你喜欢

热点阅读