iOS 关于堆栈

2018-12-21  本文已影响11人  lixiaoshuai

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

上一篇下一篇

猜你喜欢

热点阅读