美文网首页iOS开发iOS DeveloperiOS 开发
iOS开发解决循环引用问题

iOS开发解决循环引用问题

作者: Stormstout | 来源:发表于2016-08-05 01:01 被阅读342次
    @interface DemoViewController ()
    
    @property(nonatomic,copy)void (^completionCallBack)();
    
    @end
    
    @implementation DemoViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        
        //解除循环引用
    //    //方法一 : __weak
    //    __weak typeof(self) weakSelf  = self;
    //    
    //    [self LoadData:^{
    //        NSLog(@"%@",weakSelf.view);
    //    }];
        
        //方法二 : __unsafe_unretained
        //高级iOS程序员如果需要自行管理内存,可以考虑使用,但是不建议用
        __unsafe_unretained typeof(self) weakSelf   = self;
        //EXC_BAD_ACCESS 坏内存访问,野指针访问
        //__unsafe_unretained 同样是 assign 的引用(MRC 中没有 week)
        //在 MRC 中如果要弱引用对象都是使用 assgin,不会增加引用计数,但是对象一旦被释放,地址不会改变,继续访问会出现野指针情况
        //在 ARC 中,week 本质上是一个观察者模式,一旦发现对象被释放,会自动将地址设置为 nil更加安全
        //week 的效率会略微差一点
    
        [self LoadData:^{
            NSLog(@"%@",weakSelf.view);
        }];
        
    }
    
    -(void)LoadData:(void (^) ())completion
    {
        //使用属性记录block
        self.completionCallBack= completion;
        
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"耗时操作 : %@",[NSThread currentThread]);
            
            [NSThread sleepForTimeInterval:2.0];
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                //执行block
                completion();
                
            });
            
        });  
    }
    

    相关文章

      网友评论

        本文标题:iOS开发解决循环引用问题

        本文链接:https://www.haomeiwen.com/subject/eprhsttx.html