美文网首页
iOS 关于堆栈

iOS 关于堆栈

作者: lixiaoshuai | 来源:发表于2018-12-21 15:30 被阅读11次

    iOS 关于堆栈

    1. 堆栈定义
    低位地址的 内存块。 (执行速度最快, 先进后出, 大小比堆小,不需要手动释放内存 )
    公共的内存块, (程序员手动管理内存)

    说明:对于一个方法,当进入该方法作用域后,线程栈区形成一个栈帧(stack frame)(包括参数,局部变量,返回值等)进入栈中。当执行完毕后,该栈帧弹出,栈帧内所有内存全部销毁。栈中内存有系统西东管理,不会出现内存泄露问题。

    2. 堆栈变量
    根据存放位置分开堆栈变量

    3. 关于block的堆栈特性
    定义block时候,其被放置于栈区中。意味着该变量仅在定义的作用域中有效。当超出作用域后,栈区将在某个时机将该内存回收。
    若想让该变量长时间存在,需要将其拷贝到堆区。
    例子

    void (^blockName) (void);
    if ( /* someCondition */) {
      blockName = ^ {
        // …..
      }
    } else {
      blockName = ^ {
        // ……
      }
    }
    blockName();
    // 会出现时而崩溃,时而不崩溃的问题
    // 原因:在if 条件块中,定义了两个blockName的对象实例。定义的两个对象均存储于栈内存中。作用域均在块级作用域中(即if块中)。当作用域离开if块,到达外层后,则有一定概率内存可能被回收。此时调用blockName可能会导致崩溃
    

    4. block属性关键字使用copy的原因

    同上,当block被定义后其存在于栈区。当出现作用域改变的情况,原block就有可能被回收。当做赋值操作时,其需要进行copy操作,将block从栈区拷贝到堆区。保证在使用的过程中block不会被回收

    参考链接

    1. http://www.cnblogs.com/codetime/p/7353434.html

    相关文章

      网友评论

          本文标题:iOS 关于堆栈

          本文链接:https://www.haomeiwen.com/subject/epamkqtx.html