Block内的强引用

2016-12-16  本文已影响51人  杨淳引

众所周知,当某个对象持有着一个Block的时候,如果在Block内部使用强引用反过来持有这个对象,就会导致引用循环。为了避免引用循环,可以使用__weak修饰符,苹果的官方文档在用代码演示__weak修饰符的时候,有这么一个例子:



  那么,myController持有着completionHander,在completionHander内部又用一个strongMyController反过来去持有myController,这不也是一个引用循环吗?为了探究这个问题,可以用下面的方法来测试一下:

1、编写一个类ViewController,然后在类内编写方法test,做一个疑似的引用循环:



2、然后通过一个clang命令将这个类转换成C语言代码:

clang -x objective-c -rewrite-objc -isysroot
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
-fobjc-arc -stdlib=libc++ -mmacosx-version-min=10.7 -fobjc-runtime=macosx-10.7
-Wno-deprecated-declarations ViewController.m

3、由此可以得到一个cpp文件,将文件中主要的部分提取出来如下:



4、可以发现:

ViewController *const __weak weakSelf;

所以Block本身对self的引用仍然只是弱引用,并不造成引用循环。

所以最终可以确定:苹果的演示代码有可能会造成引用循环,但是只是一个暂时的、可以被打破的引用循环,不会导致内存泄漏。

上一篇 下一篇

猜你喜欢

热点阅读