前几天去阿里面试,谈到block,我说加上__block关键字可以满足block内修改block外变量的需求,加上__weak可以解决循环引用的问题
但是面试官跟我说,__block也可以解决循环引用的问题,于是我陷入了迷茫,没听过这个啊,现在我们就来分析一下,看看他说的是不是对的。
在block的底层实现结构中,我们解释了如何在block中修改外部变量,但是,当时解释的只不过是基本数据类型。
那么,对于NSObject会怎么样呢?
对于NSObject,如果我们想在NSObject中修改,那么也必须加上__block关键字,要不然就是全局变量或者static
倘若我们并不想修改呢?,只是想访问,那么你可以不加任何修饰符,直接引用。
但是这样可能会有一个循环引用的问题,为了解决这个问题,可以用weak关键字。
也可以使用__block关键字,然后再block快结束的时候,把__block引用的变量设置为nil。
只有在使用local变量时,block会复制对象,且强引用指针指向的对象一次。其它如全局变量、static变量、block变量等,block不会拷贝指针,只会强引用指针指向的对象一次。
那么面试官为什么会说block也可以起到和weak一样的作用呢?以前在非arc环境中,__block修饰的变量在Block copy时是不会retain的,所以,也可以做到破解循环引用。我估计面试官是说的以前非ARC