iOS开发iOS DeveloperiOS 开发

iOS开发解决循环引用问题

2016-08-05  本文已影响342人  Stormstout
@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();
            
        });
        
    });  
}
上一篇下一篇

猜你喜欢

热点阅读