2

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

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

编辑:

从苹果文档:

子类必须实现它们自己的 dealloc 版本,以允许释放对象消耗的任何额外内存——例如为数据或对象实例变量动态分配的存储被释放对象所拥有。在执行特定于类的释放后,子类方法应该通过向 super 发送消息来合并超类版本的 dealloc:

这使事情变得更加清晰 - 但更多的见解值得赞赏。

4

2 回答 2

1

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

iPhone:AudioBufferList 初始化和释放

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

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

于 2011-01-10T19:49:40.203 回答
0

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

至于 的dealloc方法AudioManager,发送消息时不会自动调用release,会在retain count等于0时自动调用。向release对象发送消息会减少retain count 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;
}
于 2011-01-10T19:04:10.030 回答