使用内嵌块应注意避免出现循环引用

什么是内嵌块?
作者所说的内嵌块到底指的是什么?净整新名词。
作者说的内嵌块就是方法中末尾那种回调的block,那你就直接说block不就行了吗?!

作者举的例子是注册通知中心观察者的例子。
从这个例子中可以知道一条原则

不要在dealloc中移除通知的观察者,而应该是在viewDidDisappear中。

与之对应的

不要在viewDidLoad中注册通知中心观察者,而应该在viewWillAppear中注册监听。

作者举的这个例子,是在注册通知中心的方法的尾回调block中调用了self,从而该尾回调block就持有了self。
从而这个用来监听的观察着对象就被通知中心所持有,因为有连带关系,所以self也被通知中心所持有。
因为移除观察者的代码是在dealloc中写的,而dealloc被调用的前提是self不被其他对象持有,然而要想self不被其他对象持有就必须先移除观察者,于是必须先调用dealloc,这就互为条件了,于是就造成了循环引用,这就尴尬了。

这就是个例子,没啥特别的。

如何解决循环引用呢?
就是使用__weak关键字。
有这个例子可以看出其实尾回调block也可以持有self。

你可能感兴趣的:(使用内嵌块应注意避免出现循环引用)