1

メソッドの名前には「Get」が含まれており、を介して何かを返しませんreturn。たとえば、次のようにCFStringRefへのポインタを取ります。

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

ドキュメントには、関数が提供されたoutValueポインターに値を「コピー」すると記載されています。

つまり、これは+1の保持カウントを持つオブジェクトを作成することであり、私はそのデータを解放/解放する責任がありますか?

4

1 に答える 1

3

AudioSessionGetPropertyのドキュメントによると、取得するプロパティがCタイプであるか、コアファンデーション値であるかによって異なります。

一部のCoreAudioプロパティ値はCタイプであり、その他はCoreFoundationオブジェクトです。

この関数を呼び出してCoreFoundationオブジェクトである値を取得する場合、この関数は、名前に「Get」を使用しているにもかかわらず、オブジェクトを複製します。Core Foundationのメモリ管理プログラミングガイドの「ルールの作成」で説明されているように、オブジェクトを解放するのはユーザーの責任です。

したがって、取得しているのがコアFoundationプロパティ値である場合は、結果のオブジェクトを必ずリリースする必要があります。

ARCを使用しても、これが自動的に処理されるわけではないことに注意してください。ARCプログラミングガイドから:

多くのCocoaアプリケーションでは、Core Foundationフレームワーク自体(CFArrayRefやCFMutableDictionaryRefなど)から、またはCoreGraphicsなどのCoreFoundation規則を採用するフレームワーク(CGColorSpaceRefやCGGradientRefなどのタイプを使用する場合があります)から、CoreFoundationスタイルのオブジェクトを使用する必要があります。 )。

コンパイラは、CoreFoundationオブジェクトの有効期間を自動的に管理しません。Core Foundationのメモリ管理ルール(Core Foundationのメモリ管理プログラミングガイドを参照)の指示に従って、CFRetainおよびCFRelease(または対応するタイプ固有のバリアント)を呼び出す必要があります。

Objective-CとCoreFoundationスタイルのオブジェクト間でキャストする場合は、キャスト(objc / runtime.hで定義)またはCore Foundationスタイルのマクロ(で定義)を使用して、オブジェクトの所有権セマンティクスについてコンパイラに通知する必要があります。 NSObject.h):

于 2012-01-12T20:13:00.213 に答える