1

该方法的名称中有“Get”,并且不会通过return. 例如,它需要一个指向 CFStringRef 的指针,如下所示:

CFStringRef outValue;
UInt32 propertySize = sizeof(outValue);
AudioSessionGetProperty(propertyID, &propertySize, &outValue);

文档说该函数将值“复制”到提供的 outValue 指针中。

所以这是创建一个具有 +1 保留计数的对象,我负责释放/释放该数据?

4

1 回答 1

3

根据 AudioSessionGetProperty 的文档,这取决于您获取的属性是 C 类型还是核心基础值:

一些 Core Audio 属性值是 C 类型,而另一些是 Core Foundation 对象:

如果你调用这个函数来检索一个核心基础对象的值,那么这个函数——尽管在它的名字中使用了“Get”——复制了这个对象。您负责释放对象,如 Core Foundation 内存管理编程指南中的“创建规则”中所述。

因此,如果您获得的是核心基础属性值,则需要确保释放生成的对象。

请注意,使用 ARC 不会自动为您解决这个问题。来自 ARC 编程指南:

在许多 Cocoa 应用程序中,您需要使用 Core Foundation 样式的对象,无论是来自 Core Foundation 框架本身(例如 CFArrayRef 或 CFMutableDictionaryRef),还是来自采用 Core Foundation 约定的框架,例如 Core Graphics(您可能使用 CGColorSpaceRef 和 CGGradientRef 等类型) )。

编译器不会自动管理 Core Foundation 对象的生命周期;您必须按照 Core Foundation 内存管理规则的规定调用 CFRetain 和 CFRelease(或相应的特定于类型的变体)(请参阅 Core Foundation 的内存管理编程指南)。

如果您在 Objective-C 和 Core Foundation 风格的对象之间进行转换,您需要使用转换(在 objc/runtime.h 中定义)或 Core Foundation 风格的宏(在NSObject.h):

于 2012-01-12T20:13:00.213 回答