Cocoa框架中的内存分区

  NSObject对象类实例为我们提供了两种分配内存的方式:alloc和allocWithZone:。alloc的实现也是为了调用allocWitZone:,它传入了一个默认的zone。所以明确的说,NSObject提供了一种分配内存的方式。什么是zone?为什么要使用zone?

  Zone代表了内存中的一段连续的内存区域。当我们需要创建一些具有相同访问模式以及生命周期的对象时,我们可以采用Zone让这些对象在计算机的地址空间中保持相邻的位置,这样可以提高应用程序的性能。要搞清楚对象在内存中的位置如何影响性能,我们需要知道虚拟内存以及当应用程序请求了比实际物理内存大的内存时,系统会发生什么事情?

  这些知识已经在之前的博客中有过提及,这里仅仅是简单的表述。注意:下面的表述适用于OS X系统,IOS由于处理方式不一样,但是原理大致一样,就不在此提及。

  当应用程序请求了一块内存,但是系统发现物理内存已经使用完毕,没有内存可供使用时,会触发一个页面调度程序将那些暂时不用的对象objectA的数据从内存中置换到backing store中,然后将这部分内存分配给内存请求方objectB。当objectB使用完毕后,假如objectA马上又请求内存,虚拟内存管理系统发现之前有数据置换到backing store,会尝试将这些数据置换回内存,同时也可能将objectB的数据置换到backing store,当然也与可能置换其它的对象的数据,具体置换那些根据内存使用情况而定。如果应用程序在频繁的调用objectA和objectB,那么操作系统就会频繁的使用页面置换,这十分影响性能。另外如果两个对象对应的虚拟内存位置不连续,那么这两个对象触发页面置换的可能性会非常大,因为系统一般会将一段连续的内存加载进来。

  分区确保了分配给要同时使用的对象位于相邻的位置。当使用某个对象时,另外的对象基本也会用到,因为这些对象位于同一个分区,那么所有对象同时调入内存的可能性就更大。

  Cocoa提供了一些管理内存区域的函数。例如:NSDefaultMallZone(),NSCreateZone()以及NSRecycleZone()。当然,这些东西使用的比较少,我们可能只需要了解就可以了,在将来有用处时可以考虑是否使用。

原文地址:https://www.cnblogs.com/forwk/p/4821521.html