Capturing 'self' strongly in this block is likely to lead to a retain cycle [duplicate]

//日期回调

   **__weak typeof(self) weakSelf = self;**
    datePickVC.completeBlock = ^(NSString *selectDate) {
    [**weakSelf.**starDataBtn setTitle:selectDate forState:UIControlStateNormal];
    weakSelf.starDataBtn.backgroundColor = [UIColor redColor];

    };

You should review your block for:
(a) any explicit references to self
(b) any implicit references to self caused by referencing any instance variables.

Let’s imagine that we have some simple class property that was a block (this will experience the same “retain cycle” warnings as your question, but will keep my examples a little simpler):

@property (nonatomic, copy) void (^block)(void);

And let’s assume we had some other class property we wanted to use inside our block:

@property (nonatomic, strong) NSString *someString;

If you reference self within the block (in my example below, in process of accessing this property), you will obviously receive that warning about the retain cycle risk:

self.block = ^{
NSLog(@”%@”, self.someString);
};

That is remedied via the pattern you suggested, namely:

__weak typeof(self) weakSelf = self;

self.block = ^{
NSLog(@”%@”, weakSelf.someString);
};

Less obvious, you will also receive the “retain cycle” warning if you reference an instance variable of the class inside the block, for example:

self.block = ^{
NSLog(@”%@”, _someString);
};

This is because the _someString instance variable carries an implicit reference to self, and is actually equivalent to:

self.block = ^{
NSLog(@”%@”, self->_someString);
};

One might be inclined to just use weakSelf pattern again, resulting in the weakSelf->_someString syntax, but the compiler will warn you about this:

Dereferencing a __weak pointer is not allowed due to possible null value caused by race condition, assign it to strong variable first

You therefore resolve this by using the weakSelf pattern, but also create a local strong variable within the block and use that to dereference the instance variable:

__weak typeof(self) weakSelf = self;

self.block = ^{
__strong typeof(self) strongSelf = weakSelf;

if (strongSelf) {
    NSLog(@"%@", strongSelf->_someString);

    // or better, just use the property
    //
    // NSLog(@"%@", strongSelf.someString);
}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值