Является ли я владельцем объекта, возвращенного AudioSessionGetProperty? - PullRequest
1 голос
/ 12 января 2012

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

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

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

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

1 Ответ

3 голосов
/ 13 января 2012

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

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

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

Так что, если то, что вы получаете, является базовым значением свойства основания, вам нужно обязательно освободить результирующий объект.

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

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

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

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

...