浅谈iOS的内存管理机制

2020-10-19  本文已影响0人  adaodao3056

存储分布

栈区(heap):由系统去管理。地址从高到低分配。先进后出。会存一些局部变量,函数跳转跳转时现场保护(寄存器值保存于恢复),这些系统都会帮我们自动实现,无需我们干预。所以大量的局部变量,深递归,函数循环调用都可能耗尽栈内存而造成程序崩溃 。
堆区(stack):需要我们自己管理内存,alloc申请内存release释放内存。创建的对象也都放在这里。 地址是从低到高分配。堆是所有程序共享的内存,当N个这样的内存得不到释放,堆区会被挤爆,程序立马瘫痪。这就是内存泄漏。
全局区/静态区(staic):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
常量区:常量字符串就是放在这里的,还有const常量。
代码区:存放App代码,App程序会拷贝到这里。

6545546-79ada51ce86aee82.png

内存管理方式

Object-C如何进行内存管理:ARC && MRC
OC中每个对象都有一个与之对应的整数,叫“引用计数器”。
Objective-C的内存管理本质是通过引用计数实现的!!!
MRC:在iOS5之前内存是由开发者自己手动管理的,写完代码需要合理插入retain和release,保证内存不会泄露,程序可以正常运行。
ARC:2011年WWDC大会iOS5提出了自动引用计数(ARC),内存的管理由系统进行接管,开发者只需要关注业务逻辑实现,大大提高了开发效率。
什么是引用计数?

引用计数(Reference counting)是一个简单有效管理对象生命周期的方式。
当我们新建一个新对象时候,它的引用计数+1,当一个新指针指向该对象,将引用计数+1。当指针不再指向这个对象时候,引用计数-1,当引用计数为0时,说明该对象不再被任何指针引用,将对象销毁,进而回收内存。

对象内部关联

isa形式
对象成员变量、方法、存储

上一篇 下一篇

猜你喜欢

热点阅读