直接看代码,大概就是这样子:
@interface DemoViewController ()
@property (nonatomic,copy)void (^completionCallBack)();
@end
@implementation DemoViewController
- (void)viewDidLoad {
[super viewDidLoad];
//解除引用1:__weak
// __weak typeof(self) weakSelf = self;
// [self loadData:^{
// NSLog(@"%@",weakSelf.view);
// }];
//解除引用2:__unsafe_unretained
__unsafe_unretained typeof(self) weakSelf = self;
//__unsafe_unretained同样是assign的引用(mrc中没有weak)
//在mrc中如果要弱引用对象都是assign,不会增加引用计数,但是对象一旦被释放,地址不会改变,继续访问,出现野指针
//在arc weak,本质上是一个观察者模式,一旦发现对象被释放,自动将地址设置为nil,更加安全
//效率 weak会略微差一些
[self loadData:^{
NSLog(@"%@",weakSelf.view);
}];
// Do any additional setup after loading the 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();
});
});
}
这个就是OC中解决循环引用的两种方式。