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的生命周期;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值