使用ARC
TEST1:
@interface test01ViewController ()
@property (strong) void(^myBlock)(id obj, NSUInteger idx, BOOL stop);
@end
@implementation test01ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.navigationItem.title = @"test01";
[self setMyBlock:^(id obj, NSUInteger idx, BOOL stop) {
[self doSomethingWithObj:obj];
}];
}
object(self
)对块有明确的强引用。该块具有对strong
的隐式self
引用。那是一个循环,现在这两个对象都不会被正确释放。
所以test1 dealloc
没有打电话。
TEST2:
@interface test03ViewController ()
@property (strong) void(^myBlock)(id obj, NSUInteger idx, BOOL stop);
@end
@implementation test03ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.navigationItem.title = @"test03";
__weak test03ViewController *weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL stop) {
__strong test03ViewController *strongSelf = weakSelf;
[strongSelf doSomethingWithObj:obj];
}];
}
__ weakSelf - > __strongSelf,我认为它与test1
没有区别,但test2可以调用dealloc
。
为什么?
答案 0 :(得分:2)
看一下这个答案:https://stackoverflow.com/a/28475562/543224
"无论如何,对于这种模式,捕获一个强引用,对于在块运行之前自我解除分配的情况没有做任何事情,这仍然可能发生。确保自己在执行块时不会被释放。如果块执行异步操作本身会给出一个窗口,那就很重要。"
答案 1 :(得分:0)
在第一种情况下,块捕获变量self
,这是一个强引用(即它具有类型test01ViewController * __strong
)。
在第二种情况下,块捕获变量weakSelf
,这是一个弱引用(即它具有类型test03ViewController * __weak
)。