欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发中allocWithZone/copyWithZone/NSZone解析

程序员文章站 2022-04-26 12:41:52
ios开发中allocwithzone/copywithzone/nszone解析,nszone可以想象成一个内存池,alloc或是dealloc这些操作,都是在这个内存池中操作的。 cocoa总是...

ios开发中allocwithzone/copywithzone/nszone解析,nszone可以想象成一个内存池,alloc或是dealloc这些操作,都是在这个内存池中操作的。
cocoa总是会配置一个默认的nszone,任何默认的内存操作都是在这个“zone”上操作的。默认的nszone的缺陷在于,它是全局范围的,时间一长,必然会导致内存的碎片化,如果你需要大量的alloc一些object,那么性能就会受到一些影响。
所有cocoa提供方法,你可以自己生成一个nszone,并将alloc, copy全部限制在这个”zone“之内。

iOS开发中allocWithZone/copyWithZone/NSZone解析系统默认的nszone来对应用的对象进行管理。那么在什么时候你会想要有一个自己控制的nszone呢?当默认的nszone里面管理了大量的对象的时候。这种时候,大量对象的释放可能会导致内存严重碎片化,cocoa本身有做过优化,每次alloc的时候会试图去填满内存的空隙,但是这样做的话时间的开销很大。于是乎,你可以自己创建一个nszone,这样当你有大量的alloc请求的时候就全部转移到指定的nszone里面去,减少了大量的时间开销。而且,使用nszone还可以一口气把你创建的zone里面的东西都清除掉,省掉了大量的时间去一个个dealloc对象。总的来说,当你需要创建大量的对象的时候,使用nszone还是能节省一些时间的,不过前提是你得知道怎么去用它。

另一篇2002年的文章就说开发者已经不能创建一个真正的nszone了(看来也许这就是历史原因了),只能创建main zone的一个child zone。
timothy j.wood 的回答

timothy还讲到如果可以使用nszone的话,多个对象在同一时间alloc可以减少分页使用,而且在同一个时间dealloc可以减少内存碎片。apple在这方面是做了处理了,对开发者透明,无需开发者自己去做。
allocwithzone不被apple鼓励使用,基本上多数时候程序员也不需要自己去管理自己的zone。