6.iOS中的weakSelf和strongSelf

我们在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 的生命周期。

总结

  1. 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf
  2. 如果在 Block 内需要多次访问 self,则需要使用 strongSelf
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。