zoukankan      html  css  js  c++  java
  • 控制器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
  • 相关阅读:
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    5.14
    5.13
    5.12
  • 原文地址:https://www.cnblogs.com/sunjianfei/p/6860471.html
Copyright © 2011-2022 走看看