首页 > 代码库 > 控制器pop时没有被销毁(没有走dealloc方法)错误原因

控制器pop时没有被销毁(没有走dealloc方法)错误原因

ARC环境下,不需要我们进行过多的内存的管理我们需要做的就是在dealloc方法中进行内存管理,但是错误的代码也会造成内存管理方法dealloc不执行,错误的原因无非以下三种,其中第二种和第三种最容易发生(总在不经意间就发生了这两中错误)


一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。(我的就是因为这没有走dealloc)

二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。

三.控制器中的代理属性一定要是弱引用,不要强引用。

 

__weak typeof(self) weakself=self;

 

 

 

 

 

只有当block直接或间接的被self持有时,才需要weak self。如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。

 



 

一、block是控制器的属性,如果block内部没有使用weakSelf将会造成内存泄露
self.testBlock = ^()
{
    NSLog(@"%@",self.mapView);
};
self.testBlock();

 

 

 

 

 

二、把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露

 

self.testBlock = ^()
{
    [weakSelf test];
};
-(void)test
{
    NSLog(@"%@",self.mapView);
}

 

 

 

三、当block不是self的属性时,block内部使用self也不会造成内存泄露

 

TestBlock testBlock = ^()
{
    NSLog(@"%@",self.mapView);
};
[self test:testBlock];

 

四、当使用类方法有block作为参数使用时,block内部使用self也不会造成内存泄露

 

[WDNetwork testBlock:^(id responsObject) {
   
    NSLog(@"%@",self.mapView);
}];
 
 
参考文档:http://www.jianshu.com/p/c6ca540861d9

 

控制器pop时没有被销毁(没有走dealloc方法)错误原因