iOS 内存基础知识及堆区和栈区的区别

iOS内存区域大致分为;栈区,堆区,全局区(静态区),文字常量区,程序代码区

栈区

  1. 栈区(stack)由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点是有限制,数据不灵活。(先进后出)
alloc在堆上申请一块空间返回一个指针,这个指针在栈上,申请的空间在堆上
这里指的局部变量不是对象地址,而是这个对象的指针在栈上
  1. 申请后的系统响应, 栈区存储每一个函数在执行的时候都会向操作系统所要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束释放,由系统自动完成
只要栈的剩余空间大于所申请空间,系统讲为程序提供内存,否则将报异常提示栈溢出
  1. 申请大小的限制
    栈是向低地址扩展的数据结构,是一块连续的内存的区域。是栈顶的地址和栈的最小容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就却确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小

  2. 栈由系统自动分配,速度较快,以内栈是先进后出的队列,他们时如此的一一对应,以至于永远都不可能有一个内存快从栈中间弹出,不会产生内存碎片

堆区

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表

堆是一种特殊的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构,是指二叉树。堆的特点是根节点的值最小(或最大),且根节点的两个子树也是一个堆
堆分为大根堆,小根堆,大根堆就是树的根结点大于叶子节点。
  1. 堆区(heap)由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收,比如iOS种alloc都是存放在堆中
    优点是灵活方便,数据适应面广泛,但是效率又一定降低
堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存和释放时优质程序开发者的必备的素质
  1. 堆区申请后的系统响应
首先应该知道操作系统会有一个记录空闲内存地址的链表
当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲结点链表中删除,并将该结点的空间分配给程序
由于找到的堆接点大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入到空闲链表中

3.申请大小的限制
堆向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的。而链表的便利方向是从低地址向高地址的。堆的大小受限于计算机系统中的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大
4.频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率最低,不过用起来最方便

全局区(静态区)(static)

全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。程序结束后有系统释放

文字常量区

存放常量字符串,程序结束后由系统四方

程序代码区

存放函数的二进制代码

内存分配地址

栈区
  • 栈区的内存地址是从高到低的分配
  • 栈区存放局部变量,先进后出,一旦出了作用域就会被销毁
堆区
  • 堆区的内存地址是从低到高分配
  • 堆区的变量空间分配都是alloc,程序员需要管理堆区的内存
  • ARC的内存管理,是在编辑器编译的时候,自动添加retain等,c的变量的内存管理,需要程序员处理
  • 堆区的内存由所有应用程序共享
  • 堆区的内存分配由系统来负责
  • 系统使用一个链表来维护所有已经分配过的内容空间

字符串内存管理

NSString是以恶搞不可变的字符串对象。这不是表示这个对象生命的变量的值不可变,而是表示它初始化之后,你就不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。copy和retain对他都是浅复制,也就是单纯的指针复制

浅拷贝和深拷贝

浅拷贝,只是拷贝了对象的指针,而不是拷贝对象本事。深拷贝,是直接拷贝整个对象的内存到另一快内存中

  • 浅拷贝(shallow copy):在浅拷贝操作的时候,对于被拷贝对象的每一层都是指针拷贝
  • 单层拷贝(one-level-deep copy):在深拷贝操作时,对于被拷贝对象,至少又一层是深拷贝
  • 深拷贝(real-deep copy):在完全拷贝操作是,对于被拷贝对象的每一层都是对象拷贝

集合的深拷贝

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

归档一个容器类对象(archive)拷贝后,然后解档(unarchive),即可实现里面元素的深拷贝

在容器类对象中,对immutable对象进行copy,是指针拷贝,mutableCopy是内容拷贝;对mutable对象进行copy和mutableCopy都是内容拷贝。但是:集合对象的内容拷贝仅限于对象本身,对象元素仍然是指针拷贝。

内容参考

编码篇-iOS程序中的内存分配 栈区堆区全局区等相关知识

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容