什么是NSZone?使用initWithZone有什么好处:?

pra*_*epa 29 iphone objective-c

有很多功能,如

1. NSDefaultMallocZone()
2. NSCreateZone();
3. NSRecycleZone();
4. NSSetZoneName();
5. NSZoneMalloc();
and many more related to NSZone

NSZone意味着什么,在哪里使用这些功能以及何时使用?
initWithZone的优点是什么:以及如何在我的iphone应用程序中使用?

Ale*_*nte 44

NSZone是Apple优化对象分配和释放的方式.NSZone不是一个对象; 它是一个不透明的C-struct,存储有关如何为一组对象处理内存的信息.

人们很少需要担心在应用程序中处理您自己的区域; Cocoa透明地处理它.默认NSZone在启动时创建,所有对象默认在那里分配.那你为什么要用自己的呢?

如果您批量分配数百个廉价对象,您可能会发现为它们实际分配空间的成本变得非常重要.因为标准区域一直在使用,所以它可能变得非常零散; 删除的对象会在整个内存中留下尴尬的空白.标准NSZone的分配器知道这一点,它试图填补这些空白而不是从系统中获取更多内存,但如果区域变得非常大,这可能会花费很多时间.

如果你想大规模分配对象,那么,你可以创建自己的区域并告诉它不要费心去寻找新对象的间隙.分配器现在可以每次都跳到它分配的内存的末尾并快速分配内存对你的新对象,省去了很多努力.

分配器也可以节省您在其他地方的时间,因为要求操作系统提供更多内存(区域在填满时需要执行的操作)是另一项成本高昂的操作,如果它已经完成的话.更快的是一次要求大量的内存,你可以告诉你的NSZone在这里做什么.

有传言说,NSZone可以在Good Old Days中节省你的释放时间,用一种方法可以简单地丢弃所有分配的内存,而不必费心去调用deallocator.如果一组对象是自包含的,这可以节省大量时间,因为您可以立即将它们全部丢弃,而无需繁琐地将它们全部解除分配.唉,目前的文件中似乎没有这种天赐的迹象; 单个NSZone方法(NSRecycleZone?)小心地将所有对象放在一个区域中,整齐地放在默认的NSZone上.并不是一个巨大的节省时间.

因此,总而言之,区域可以节省大量分配的时间.但只有程序员知道如何使用它们!

来自CocoaDev

  • 另外需要注意的是,如果您使用ARC,则不能再使用NSZone.你应该是哪个. (9认同)
  • 来自https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW11:"您无法使用内存区域.不再需要使用NSZone - 无论如何它们都被现代的Objective-C运行时所忽略." 基础功能文档表明在iOS和64位OSX运行时确实忽略了区域. (3认同)