搜索
您的当前位置:首页正文

再论block,以及weak和block关键字

来源:二三娱乐

前几天去阿里面试,谈到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

Top