关于Block中的weakSelf和strongSelf
Overview
在年前一个朋友问我__weak typeof(self) weakSelf = self;
和 __strong typeof(self) strongSelf = weakSelf;
的意思是什么?
当时瞬间词穷了,虽然知道它是为了避免循环引用,但如何避免?为什么用__weak
和__strong
进行修饰。于是和朋友讨论特整理此篇博客。
首先我们应该知道Blocks是C语言的扩充功能,是带有局部变量的匿名函数。当然,Block只是Objective-C对闭包的实现,并不是iOS独有的概念,在C++、Java等语言中也都是有闭包的。
关于此问题
针对__weak typeof(self) weakSelf = self;
和 __strong typeof(self) strongSelf = weakSelf;
分别代表什么意思的问题,最后和朋友讨论并查询资料,总结如下。
1 |
|
为了避免循环引用Working With Blocks文档上也给出了相应的解决方法“it’s best practice to capture a weak reference to self”。
所以当我们使用Block,将self传入Block之前,将self转换成weak automatic 的变量,这样block中就不会出现对self的强引用。
在执行完block以后,self就会被释放,weakSelf也会变成nil。
但如果在同一Block中多次调用self的时候,因为在调用第一次self的时候weakSelf就会变为nil, 所以就需要__strong来确保self不会被提前释放。