如果不熟悉__block 和 block的应用和混合使用的请先移步上篇文章
Block 拷贝或者捕获的是指针指向的内存地址,还是指针地址
验证思想,分别使用 __block 和 __weak 来防止循环引用,看看对象会不会被释放
第一个__block 例子
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic, copy)void(^block)(void);
@property(nonatomic, strong)NSMutableArray *array;
@end
@implementation ViewController
- (void)dealloc {
NSLog(@"已经销毁");
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
__block ViewController *weakS = self;
[self setBlock:^{
NSLog(@"%@",weakS.array);
}];
self.block();
}
- (NSMutableArray *)array {
if (_array == nil) {
NSMutableArray *array = [NSMutableArray array];
_array = array;
}
return _array;
}
第二个__weak 例子
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic, copy)void(^block)(void);
@property(nonatomic, strong)NSMutableArray *array;
@end
@implementation ViewController
- (void)dealloc {
NSLog(@"已经销毁");
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
__weak ViewController *weakS = self;
[self setBlock:^{
NSLog(@"%@",weakS.array);
}];
self.block();
}
- (NSMutableArray *)array {
if (_array == nil) {
NSMutableArray *array = [NSMutableArray array];
_array = array;
}
return _array;
}
把这个 ViewController 从 UINavigationController 中pop 出去,只有 __weak 修饰符的例子,打印了 已经销毁 的字样
由此得出结论
不管 block 捕获的是 指针的指针地址还是指针指向的内存地址,都会导致循环引用
但是 循环应用的根本原因是 指针指向的内存导致的,如果我们把第一个__block例子的block的实现代码改一下
__block ViewController *weakS = self;
[self setBlock:^{
NSLog(@"%@",weakS.array);
weakS = nil;
}];
这样就可以避免了,但是第二次调用就读取不到array的值了,所以慎用!!!!!!!还是安安心心的用__weak 吧
网友评论