ARC中的block

在arc之后,block变得更加简单了。

只有global和heap block了,原来的stack block没有了。


从log里面清楚的看到,原来非arc的stack block变成了mallocblock,也就是常说的堆block。

然后我们看看car对象的释放:


很清楚car的dealloc的调用是在Block2释放以后。那么也就是说,我们在Block2=Block1这个地方,car被arc引用计数+1了,相当于car的生命周期延长到了block2对象了。所以,只有block2释放了,car对象才会释放。可以验证一下,我们把Block2 = Block1这行代码去掉。


没有问题,在Block1和car对象的作用域结束那里,car就被释放了,而不像之前的在Block2后面才释放。所以说,arc还是很牛逼的,它已经帮助处理好了oc对象的引用问题,不像非arc下面,需要程序员自己去控制,如果是stack block的话,要千万小心,需要自己控制生命周期,如果是heap block的话,就需要自己调用Block_copy和Block_release来进行控制。arc就简单多了,自动处理好了,如果block里面引用了外面的变量,直接就是堆block了,如果是oc对象,也不用关心内存释放问题,就算是block传递出去了,也无需关心,都自动帮你处理好了,像上面的例子,如果block传递出来了(到car对象作用域外面),那么car对象的生命周期也被延长了,实际就是arc情况下,编译器做了些手脚,插入了引用计数增加的代码。







猜你喜欢

转载自blog.csdn.net/zj510/article/details/48246075
arc