iOS 内存管理(再探究)

2017-08-01  本文已影响47人  hehtao

概述: 结合内存分配和使用内存访问再谈内存管理(不适合内存管理小白)


一.为什么要管理内存?

系统不帮我们管理,我们就自己管理啊!!!,听起来很对啊,可是系统为什么要提我们管理呢? 当然是为了以最优方式最大化利用有限的内存资源了!,那就有必要先来了解下内存分配算法了.

总结:综合以上四种常见的内存分配算法,我们不看看出,要解决最大的问题就是如何最大化最快捷的利用内存,也就是我们内存管理的终极目的;

二. 内存访问方式:

简单说,CPU 就是通过内存的物理地址来确定数据所在的准确位置,然后进行读写操作;

(下面一段内容可直接跳过,主要是对上述访问过程的详细分析)


  1. CPU 通过地址总线 确认要访问的内存单元号和具体的数据地址;
  2. CPU 通过控制总线告诉内存要进行的操作,read , write or other;
  3. CPU与内存通过数据总线进行数据传输;
    以上所有的数据传输,皆是以高(1)低(0)电平的形式进行,是不是已经很接近机器语言了?(很久没看硬件层的东西了,若有错误还望指正)


开发中注意点1:memory warning 处理不当, APP 存在被被系统强制杀死的可能性


三. 内存分布:

想要管理内存,总得知道你要管理的数据在哪吧?看一个经典的C 内存分布:

内存分布.png

最简单来说分为两大部分:指令+数据。再细分一点,五部分:代码(机器码,看构造应该是ARM 指令集),初始化数据区,未初始化数据区,堆,栈。


MRC 所说的“谁分配谁释放”说的都是堆上对象的管理;


总结: 通过内存分布,不难发现我们所要管理的基本就是堆 和 栈了!

四. 堆和栈的分析:

堆栈具体特性,百度大把,不做阐述,下面简述分配与访问:

上述分析涉及一个基本类型和OC对象存储的问题,基本数据类型在栈区,OC对象在堆区,那么如若对数据进行装箱和拆箱操作,势必会带来额外的内存开销,所以,不要不关心数据类型!

随带引出野指针和内存泄露的概念:

五. 内存相关的修饰符

六. 看完内存分配算法顺便分析一下 alloc 和 new 的区别:

alloc 和 new 最终都要调用底层的 malloc 函数族;
直接上源码:

+new{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
    return ;
else
    return newObject;
}
 +alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}

很明显,区别只在于alloc分配内存的时候使用了zone,这个zone是个什么东东呢?它是给对象分配内存的时候,把关联的对象分配到一个相邻的 内存区域内(循环首次适应算法 ),以便于调用时消耗很少的代价,提升了程序处理速度;

new 和 malloc 区别:

new 和 malloc效率比较
上一篇 下一篇

猜你喜欢

热点阅读