iOS block循環(huán)引用的一點領悟

這幾天看了block,但是對于其中的一些問題還是非常的疑惑。

我們知道,之所以造成bolck循環(huán)引用是因為,self持有了block,block又強引用持有了self 。

但是為什么在block內部再次強引用就不會造成循環(huán)引用呢?

代碼如下:


@interface zswViewController ()

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

@property(nonatomic,assign)NSInteger num;

@end

@implementationzswViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blueColor];

    __weak typeof(self) weakSelf =self;

    self.he= ^{

        __strong typeof(weakSelf) strongSelf = weakSelf;

        NSLog(@"%ld", (long)strongSelf.num) ;

    };



   self.he();



}

這是因為,直接使用外部變量的block會默認根據外部是否是強引用,而決定內部是否強引用。

所以如果直接引用self,block就會強引用self。而此時block有被self持有。所以block的生命周期(不考慮其他類引用了blcok)必須要要等到self釋放時 block引用計數-1,才能釋放。

但是如果先weak以后,再在block里使用strong。block先弱持有self,然后block的內部變量持有self。而內部變量的生命周期在執(zhí)行完block {} 括號后就要釋放,不需要等到block釋放。所以block執(zhí)行完畢后self只有blcok的弱持有,所以不會造成循環(huán)引用。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容