@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();
});
});
}
网友评论