关于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
2
3
4
5
6
7
8
9

__weak typeof(self) weakSelf = self;

__strong typeof(self) strongSelf = weakSelf;

- weakSelf 是为了不让引用计数增加

- strongSelf 是为了防止weakSelf变为nil


关于Block中的weakSelf和strongSelf

为了避免循环引用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不会被提前释放。

参考资料