【问题标题】:Using malloc/free in Objective-C object在 Objective-C 对象中使用 malloc/free
【发布时间】:2011-06-06 17:29:52
【问题描述】:

我有一个 AudioManager 类,其成员类型为 AudioBufferList *。 (这是在CoreAudio 框架中声明的结构)。由于AudioBufferList 不是NSObject,我无法保留它,所以我必须分配/释放它(如果我错了,请纠正我)。

我的问题是,释放它的“正确”位置在哪里?目前我正在使用AudioManagerdealloc 方法。如果我理解正确,一旦将release 消息发送到AudioManager 的实例,就会自动调用此方法——是这样吗?关于在 Objective-C 对象的非对象成员上使用 alloc/free,还有其他推荐的做法吗?

编辑:

来自 Apple 的文档:

子类必须实现自己的 版本的 dealloc 以允许 释放任何额外的内存 被对象消耗——例如 为数据动态分配的存储空间 或拥有的对象实例变量 释放的对象。后 执行特定类别 释放,子类方法 应该包含超类版本 通过消息给super的dealloc:

这让事情变得更清晰了 - 但我们也感谢您提供更多见解。

【问题讨论】:

    标签: objective-c ios4 dealloc


    【解决方案1】:

    是的,您确实需要 malloc/释放内存。这里有一个很好的答案/示例,包括正确的内存管理:

    iPhone: AudioBufferList init and release

    至于“何时”,您不仅需要在释放 AudioManager 时释放内存,还需要在 AudioBufferList 的值发生更改时释放内存。例如。如果指针最初引用 AudioBufferList 结构的某个“实例 A”,而您将其更改为指向 AudioBufferList 结构的某个“实例 B”,那么您将需要为“实例 A”释放内存,否则它可能会丢失。 (而且内存会被泄露。)

    很重要的一点,也许是你知道但不小心打错了:deallocrelease 被发送到一个对象时不会被调用。 NSObject 的实例仅在其保留计数达到零时才被释放。一个对象的保留计数可能为 2,在发送[myObject release] 后,其保留计数将变为 1。但它不会被发送dealloc 消息,因为这意味着某些其他对象仍然“拥有”该实例,并且依赖该对象来保持分配和可用。

    【讨论】:

    • 是的,完全清楚在分配指向另一个地址的指针之前需要 free() ...感谢您的澄清。
    【解决方案2】:

    您不需要对其进行 malloc 或 free 操作。您将使用结构,例如 CGRect 或 AudioBufferList,就像使用 int 或 double 一样。在非对象类型上,retain、alloc、dealloc、release 等没有问题。

    至于AudioManagerdealloc方法,在发送release消息时不会自动调用,当retain count为0时会自动调用。发送release消息给一个object 将保留计数减 1。它可能还有其他保留它的东西,在这种情况下,它还不会被释放。

    编辑

    Apple 如何使用结构类型的示例:

    CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
    {
      CGRect rect;
      rect.origin.x = x; rect.origin.y = y;
      rect.size.width = width; rect.size.height = height;
      return rect;
    }
    

    【讨论】:

    • 但是非对象类型(例如AudioBufferList)仍然可能需要'c-style' malloc/free,不是吗?我的意思是,有时您需要动态分配内存。 (感谢您评论的第二部分)。
    • 除非 AudioBufferList 有什么特别的地方不清楚,否则没有。例如,看看 Apple 的方法 CGRectMake,我将在我的答案的编辑中发布它。
    • 当然,如果您只想返回数据类型的副本。但是如果你必须创建一个CGRect 的数组,它的大小只有在运行时才知道呢?然后,据我所知,您必须为它动态分配内存。
    • 几乎总有办法避免实际使用malloc()free(),但这并不总是值得麻烦的。例如,对于CGRect 的数组,您可以使用NSValueNSArray
    • 该问题询问指向 AudioBufferList 结构的指针,该结构将是新分配对象的空指针。因此,需要 malloc 和 free 来分配指向的内存。
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2021-12-11
    • 2021-01-18
    • 2011-12-15
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多