我们在Block中引用对象时,通常都会使用__weak __typeof(self) weakSelf = self;如下:
- (void)test{
__weak __typeof(self) weakSelf = self;
self.blockTest = ^(NSString *testStr) {
[weakSelf doSomething];
};
}
一般情况下不会出现问题;但是在一些复杂的逻辑中,这样写并不安全,因为在Block执行的过程中weakSelf有可能会被置nil,从而导致crash的发生;虽然这种情况并不多见,但是一旦出现,我们很难找到崩溃的原因;这时候我们就可以通过在Block中使用strongSelf既能避免这种为空情况,又能不产生循环引用;如:
- (void)test{
__weak __typeof(self) weakSelf = self;
self.blockTest = ^(NSString *testStr) {
//这里的weakSelf 和 strongSelf 配合使用是防止block中使用对象,对象出现空导致接下来的代码出现问题的情况.
__strong __typeof(weakSelf)strongSelf = weakSelf;
[strongSelf doSomething];
};
}
__strong __typeof在编译的时候,实际是对weakSelf的强引用。 指针连带关系self的引用计数还会增加.但是这个是在block里面,生命周期也只在当前block的作用域。所以,当这个block结束, strongSelf随之也就被释放了,同时也不会影响block外部的self的生命周期;