zoukankan      html  css  js  c++  java
  • Block memory

    block 有什么意义,特点等等,这些东西,实在是太复杂了,这里只是简单的总结一下block的内存管理。而且也仅仅限于objective-C的部分

    Block memory

    block 的内存管理,应该是最头疼的地方,就用这个来自WWDC的例子来解释一下吧。

    image

    当程序运行到这里时,stack 空间中有 shared 变量和 captured 变量。

    这里可以看出,__block 变量开始是处于stack上的。

    image

    当程序运行到这里时,stack 空间中有 shared 变量,captured 变量和block1。

    这里可以看出,block 类型的变量开始时也是处在stack上的。

    image

    当程序运行到这里时,stack 空间中有 shared 变量,captured 变量和block1。

    这里值得注意的就是当我们直接修改stack 上的captured变量时,block1中的captured变量仍然是原来的数值10。事实上,从const 我们就可以看出,block1中的captured变量是不能被修改的而且是从stack原有变量的一个const 拷贝。在block1中访问的captured变量是const拷贝的,也就是说block1中captured = 10,而不是原有的stack上的值 20。当然,在block1中,我们也不能修改captured变量。

     

    Copy block

    block在一开始是处在stack上的,这是为了考虑到效率的原因,但是,有时候是需要block的生命周期长于一开始的stack,这时,我们就通过copy block 来将block复制到heap。

    image

    当程序执行完 block2 = [block1 copy];时,__block 类型变量shared,被复制到了heap中,很显然,shared变量需要被block和block2共享(当然还有stack也要共享),而block2被移动到heap中,很可能生命周期会长于stack,所以,shared也被复制到了heap中。而block2中的captured 也被复制到了heap中。

    image

    当程序执行完 block3 = [block2 copy];时, 我们看到的是,block2 和block3 其实指向的是同一片内存空间。事实上,block的数据结构中,保存了引用计数,而对于copy到heap中的block 再copy时,行为同普通对象retain一样,会使引用计数+1。那么如果我们对[block retain]会如何呢? 实际上什么都没有发生,至少在现在的runtime版本下。因为retain中,不仅有引用计数+1在,而且retain的返回值,必须同返回调用对象的地址一样,而block的地址是可能变化的(stack or heap),所以,这里retain的行为几乎是被忽略掉的。

    当heap中的block变量先于stack被销毁时,如调用 [block2 release]; [block3 release];,heap中的block2,block3 由于引用计数为0 而被销毁,而 __block 变量shared则还在heap中,因为stack还要使用,block1 也要使用。

    image

    当heap中的block变量晚于stack时,显然,stack 被清除,function中也啥都没了。

    image

    最后,当block2 和block3 都被release之后。则恢复到最初状态

    image

     原文地址:http://www.cnblogs.com/studentdeng/archive/2012/02/03/2336863.html

    by xuejiang

  • 相关阅读:
    GSM和GPRS的区别
    IP规划和VLSM子网划分例题
    20190806-sed面试题
    yum.rpm一点点
    实验:基于http的yum源
    vim编辑二进制文件
    关于find的-perm
    误删tree命令如何恢复
    删除Linux的依赖库并进入救援模式恢复
    第六天、用户、组、权限、grep
  • 原文地址:https://www.cnblogs.com/ydhliphonedev/p/2795662.html
Copyright © 2011-2022 走看看