2011-05-23 87 views
27

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

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

是什么意思NSZone,在使用这些功能,当如此多的功能?
initWithZone有哪些优势:以及如何在我的iPhone应用程序中使用?

回答

38

NSZone是苹果公司优化 对象分配和释放的方式。 NSZone 不是一个对象;它是不透明的 C结构存储关于如何为一组 对象处理内存的信息。

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

如果您正在大量分配数百个廉价对象,您可能会发现实际为它们分配空间的代价为 会变得很重要。由于 标准区域一直在使用,因此 可能变得非常不规则;删除 对象可能在整个内存中留下尴尬的空白 。标准NSZone的分配器知道这一点,并且它 试图填充这些差距,优先选择 以从 系统中获取更多内存,但是如果区域增长得相当大,则这可能在时间上成本高昂 。

如果你想那么大规模分配对象, ,您可以创建自己的区域, 告诉它不与寻求 差距,提出了新的对象理会该 分配器现在可以跳转到 结束其每次分配的内存和 快速分配内存到您的新的 对象,节省了大量的努力。 ,

分配器可以节省您的时间 其他地方,也为要求OS为 更多的内存,其中一个区需要做 每当它填满了,是另一个 昂贵的操作,如果它做了很多。 更快的是一次要求大块内存 ,并且您可以告诉 您的NSZone在这里也要做什么。

有传言说,NSZone能释放时间节省 你在好老 天,也有方法,简单地 夹头了所有的分配内存 也懒得打电话 deallocators。如果一组对象是自包含的,这可以节省很多时间,因为您可以一次性将所有对象全部删除 ,而无需繁琐地将它们全部解除分配。唉, 在当前的文档中似乎没有这个天赐之物 的迹象; 单NSZone方法(NSRecycleZone?) 小心地将所有对象整齐排列在默认NSZone上的 区域中。不是 正是一个巨大的节省时间。

因此,总而言之,区域节省您在 质量分配的时间。但只有当 程序员知道如何使用它们!

CocoaDev

+8

另外需要注意的是,如果你使用ARC不能使用NSZone了。你应该这样做。 – Adam 2013-01-24 01:10:35

+0

@亚当,如果您也可以添加引用,我认为该评论值得添加到答案中。 – 2013-08-04 07:10:43

+1

从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运行时确实忽略了区域。 – Norswap 2013-11-27 12:59:23