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();
{
NSLog(@"%@",self.mapView);
};
self.testBlock();
二、把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露
self.testBlock = ^()
{
[weakSelf test];
};
-(void)test
{
NSLog(@"%@",self.mapView);
}
{
[weakSelf test];
};
-(void)test
{
NSLog(@"%@",self.mapView);
}
三、当block不是self的属性时,block内部使用self也不会造成内存泄露
TestBlock testBlock = ^()
{
NSLog(@"%@",self.mapView);
};
[self test:testBlock];
{
NSLog(@"%@",self.mapView);
};
[self test:testBlock];
四、当使用类方法有block作为参数使用时,block内部使用self也不会造成内存泄露
[WDNetwork testBlock:^(id responsObject) {
NSLog(@"%@",self.mapView);
}];
NSLog(@"%@",self.mapView);
}];
参考文档:http://www.jianshu.com/p/c6ca540861d9