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不会被回收
参考链接