我是否拥有AudioSessionGetProperty返回的对象?

时间:2012-01-12 19:24:40

标签: ios memory-management automatic-ref-counting audiosessionservices

该方法的名称中包含“获取”,并且不会通过return返回内容。它需要一个指针,例如CFStringRef,如下所示:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  

某些Core Audio属性值是C类型,其他值是Core Foundation对象:

     

如果调用此函数来检索作为Core的值   基础对象,然后这个功能 - 尽管在其中使用“获取”   name-复制对象。你有责任释放   对象,如内存管理中的“创建规则”中所述   核心基金会编程指南。

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

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

  

在许多Cocoa应用程序中,您需要使用Core Foundation风格   对象,无论是来自Core Foundation框架本身(例如   CFArrayRef或CFMutableDictionaryRef)或采用的框架   核心基础约定,例如Core Graphics(您可以使用类型   比如CGColorSpaceRef和CGGradientRef)。

     

编译器不会自动管理Core的生命周期   基础对象;你必须打电话给CFRetain和CFRelease(或者   相应的类型特定的变体)由核心指示   基础内存管理规则(请参阅内存管理编程   核心基金会指南)。

     

如果您在Objective-C和Core Foundation风格的对象之间进行投射,那么   需要告诉编译器有关对象的所有权语义   使用强制转换(在objc / runtime.h中定义)或核心   基础风格的宏(在NSObject.h中定义):