Владею ли я объектом, возвращаемым AudioSessionGetProperty?

Метод имеет в названии «Get» и ничего не возвращает через return. Он принимает указатель, например, на CFStringRef, например:

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

В документации сказано, что функция «копирует» значение в предоставленный указатель outValue.

Итак, это создание объекта с числом сохранений +1, и я несу ответственность за выпуск/освобождение этих данных?


person openfrog    schedule 12.01.2012    source источник


Ответы (1)


Согласно документации для AudioSessionGetProperty, это зависит от того, является ли свойство, которое вы получаете, типом C или является ли оно базовым значением:

Некоторые значения свойств Core Audio относятся к типам C, а другие — к объектам Core Foundation:

Если вы вызываете эту функцию для извлечения значения, являющегося объектом Core Foundation, то эта функция — несмотря на использование «Get» в ее имени — дублирует объект. Вы несете ответственность за освобождение объекта, как описано в разделе «Правило создания» в Руководстве по программированию управления памятью для Core Foundation.

Поэтому, если то, что вы получаете, является основным значением свойства фундамента, вам нужно обязательно освободить полученный объект.

Обратите внимание, что использование ARC не позаботится об этом автоматически. Из руководства по программированию ARC:

Во многих приложениях Cocoa вам необходимо использовать объекты в стиле Core Foundation, будь то из самой инфраструктуры Core Foundation (например, CFArrayRef или CFMutableDictionaryRef) или из платформ, которые принимают соглашения Core Foundation, такие как Core Graphics (вы можете использовать такие типы, как CGColorSpaceRef и CGGradientRef). ).

Компилятор не управляет временем жизни объектов Core Foundation автоматически; вы должны вызывать CFRetain и CFRelease (или соответствующие варианты для конкретного типа) в соответствии с правилами управления памятью Core Foundation (см. Руководство по программированию управления памятью для Core Foundation).

Если вы выполняете приведение между объектами в стиле Objective-C и Core Foundation, вам необходимо сообщить компилятору о семантике владения объектом, используя либо приведение (определенное в objc/runtime.h), либо макрос в стиле Core Foundation (определенное в NSObject.h):

person Tim Dean    schedule 12.01.2012