【问题标题】:What's the deal with NSZoneFree in -(void)dealloc?-(void)dealloc 中的 NSZoneFree 是怎么回事?
【发布时间】:2010-09-24 10:54:06
【问题描述】:

在 Apple 的 NSObject 文档中,NSZoneFree 在 - (void)dealloc 示例代码中被调用:

- (void)dealloc {
    [companion release];
    NSZoneFree(private, [self zone])
    [super dealloc];
}

您可以在上下文over here 中找到它。

我从来没有想过我应该在我自己的 NSObject 子类(或 NS_WhateverClass_ 子类)中调用 NSZoneFree,并且在文档中的任何地方都找不到关于该主题的任何结论。

关于使用 NSZoneFree,我所能找到的只是在 Memory Management Programming Guide 中的一个简短提及,以及在 Foundation Functions Reference 中对该功能的解释,但这些文档都没有让我清楚我是否应该在dealloc 方法的上下文。

谁能澄清我什么时候应该在我自己的类的 dealloc 实现中调用 NSZoneFree?

编辑:感谢您的回复,我现在更清楚了 :) — Dirk

【问题讨论】:

    标签: objective-c cocoa memory


    【解决方案1】:

    NSZoneFree() 平衡对NSZoneMalloc() 的调用,就像-release 平衡对-alloc-copy 的调用和CFRelease() 平衡对CFRetain()CF*Create*() 的调用一样重要的是,free() 平衡对malloc()calloc() 的调用。

    鉴于 C 库在 Mac OS X 上使用的分配器,其中大部分是学术性的,但最佳实践表明,您释放内存的方式与获得它的方式相同,并且在该类的情况下, 实例变量private 之前已分配有NSZoneMalloc()

    【讨论】:

      【解决方案2】:

      根据Foundation Reference

      将内存返回到分配它的区域。标准 C 函数 free 的作用相同,但要花时间查找内存属于哪个区域。

      所以,在清理 malloc'd 和 calloc'd 内存时,您基本上使用 NSZoneFree(),而不是 free()。但是,您通常不需要调用它。

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 2017-10-20
        • 2013-07-06
        • 2012-03-09
        相关资源
        最近更新 更多