iOS中block循环引用问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中block循环引用问题相关的知识,希望对你有一定的参考价值。
1、block是控制器对象的一个属性,则在block内部使用self将会引起循环应用
typedef void(^TestBlock)(); @interface SecondViewController () @property (nonatomic, copy)TestBlock testBlock; @end self.testBlock = ^() { NSLog(@"%@",self.mapView); }; self.testBlock();
2、把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露
self.testBlock = ^() { [weakSelf test]; }; -(void)test { NSLog(@"%@",self.mapView); }
3、当block不是self的属性时,block内部使用self也不会造成内存泄露
TestBlock testBlock = ^() { NSLog(@"%@",self.mapView); }; [self test:testBlock];
4、当使用方法有block作为参数使用时,block内部使用self也不会造成内存泄露
- (void)viewDidLoad { [super viewDidLoad]; [self getData:^(NSString *str){ NSLog(@"%@----%@", self, str); }]; [[self class] getData:^(NSString *str) { NSLog(@"类方法--%@---%@", self, str); }]; } - (void)getData:(SuccessBlock)success{ if (success) { success(@"success"); } } + (void)getData:(SuccessBlock)success{ if (success) { success(@"success"); } }
以上是关于iOS中block循环引用问题的主要内容,如果未能解决你的问题,请参考以下文章
iOS底层探索之Block——如何解决Block循环引用问题?
iOS 面试题:block 什么时候需要构造循环引用 --转自唐巧