与NSZoneFree的交易是什么 - (void)dealloc?

时间:2008-11-28 12:58:52

标签: objective-c cocoa memory

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

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

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

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

我可以在Memory Management Programming Guide中简要提及使用NSZoneFree的所有内容,以及Foundation Functions Reference中对该功能的解释,但这些文档都没有告诉我是否应该担心在dealloc方法的背景下关于它。

任何人都可以澄清我何时应该在我自己的类的dealloc实现中调用NSZoneFree?

编辑:感谢您的回复,现在对我来说更清楚了:) - 德克

2 个答案:

答案 0 :(得分:2)

NSZoneFree()平衡了对NSZoneMalloc()的通话,就像-release平衡拨打-alloc-copyCFRelease()来平衡通话一样至CFRetain()CF*Create*(),或者free()平衡对malloc()calloc()的调用。

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

答案 1 :(得分:1)

根据Foundation Reference

  

将内存返回到分配它的区域。标准C函数free也是如此,但花时间查找内存所属的区域。

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