2011-01-10 67 views
2

我有一个类AudioManager,其成员类型为AudioBufferList *。 (这是一个在CoreAudio框架中声明的结构体)。由于AudioBufferList不是NSObject,我不能保留它,所以我必须分配/释放它(纠正我,如果我错了)。在Objective-C对象中使用malloc/free

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

编辑:

从苹果文档:

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

这使得事情一点点清晰的 - 但更多的见解表示赞赏。

回答

1

是的,你确实需要的malloc /释放内存。这里有一个伟大的答案/例如,适当的内存管理包括:

iPhone: AudioBufferList init and release

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

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

0

你不需要做malloc或free就可以了。您可以使用一个结构,如CGRect或AudioBufferList,就像使用int或double一样。对于非对象类型,保留,alloc,dealloc,release等没有问题。

至于AudioManagerdealloc方法中,当在发送消息release它不会自动被调用,它会自动被调用时保留计数等于0 1发送release消息给物体减小保留计数它仍然可以有其他保留它的东西,在这种情况下它还不会被处理。

编辑

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

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; 
} 
+0

但是非对象类型(如`AudioBufferList`)仍然可能需要'c-style'malloc/free,否?我的意思是,有时你需要动态分配内存。 (并感谢您评论的第二部分)。 – 2011-01-10 19:07:17

+0

除非AudioBufferList有一些不明确的地方,否则不会。例如,看看苹果的方法,CGRectMake,我将在编辑中发布我的答案。 – GendoIkari 2011-01-10 19:08:46