3

未解決の強力な参照がまだあると仮定すると、誰も(ARCも私も)オブジェクトを管理していないため、これはリークになりますか?

 CFTypeRef cf_object = CFBridgingRetain(arc_object);
 // do stuff
 CFRelease(cf_object);
4

2 に答える 2

3

あなたの質問に答えるために、上記のコードはうまく見えます。CFを実行しているCFReleaseときは、を実行する必要があります。Robが提案したように、の使用法も調べることができます。ARCの変更に関連する詳細については、このRaywenderlichチュートリアルを参照してください。CreateRetainCopyCFBridgingRelease

のアップルのドキュメントによるとCFBridgingRetain

Objective-CポインターをCoreFoundationポインターにキャストし、所有権を呼び出し元に譲渡します。

CFTypeRef CFBridgingRetain(id X)

説明: この関数を使用して、Objective-CオブジェクトをCore Foundationスタイルのオブジェクトとしてキャストし、オブジェクトの所有権を取得して、その存続期間を管理できるようにします。その後、オブジェクトを解放するのはユーザーの責任です。

cf_objectここでは、 ARCが処理しないものをリリースする必要があります。を呼び出すとCFRelease、リリースされます。

に関するドキュメントCFBridgingRelease

非Objective-CポインタをObjective-Cに移動し、所有権をARCに譲渡します。

id CFBridgingRelease(CFTypeRef X)

説明:この関数を使用して、Core FoundationスタイルのオブジェクトをObjective-Cオブジェクトとしてキャストし、オブジェクトの所有権をARCに譲渡して、オブジェクトを解放する必要がないようにします。

CFBridgingReleaseを使用すると、所有権がARCに譲渡され、ARCが管理することに注意してください 。

例:-

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *name = (NSString *)CFBridgingRelease(cfName);

ARCがnameここで管理します。

于 2013-01-05T19:22:15.683 に答える
2

改訂された質問では、提供したコードにリークはありません。を使用して、Objective-CオブジェクトをCore FoundationポインターにキャストCFBridgingRetainし、プロセスでのCoreFoundationオブジェクトの保持数を増やしました。CFReleaseただし、これと、保持カウントを再び減らす(保持カウントがゼロの場合は割り当てが解除される)とのバランスをとったので、すべて問題ありません。漏れはありません。

結論として、この小さなCore Foundationの往復cf_objectは、ARCのの管理に悪影響を与えることはありませんarc_object

だから、あなたの質問は:

未解決の強力な参照がまだあると仮定すると、誰も(ARCも私も)オブジェクトを管理していないため、これはリークになりますか?

いくつかの考え:

  1. ARCはCoreFoundationオブジェクトを管理していませんcf_object。あなたは。そして、電話することによってCFRelease、あなたはあなたの責任を果たしました。

  2. ARCはObjective-Cオブジェクトの管理を停止しませんでしたarc_object。まだです。そして、すべての強力な参照が削除されると(Core Foundationの保持を含む)、オブジェクトの割り当てが解除されます。

  3. あなたは他の強い言及があることについてのコメントであなたの質問の前に置きます。これは、リーク、Core Foundationによるメモリの手動管理などの問題とは関係ありません。CoreFoundation関連のコードコードがクリーンアップに失敗してリークが発生した場合、他の強力な参照に関係なく、クリーンアップされます(ただし、確かに、通常、他のすべての強力な参照が削除されるまで、実際にリークを経験/検出することはありません)。

この質問は、コードのリークとCoreFoundationのオブジェクトと関数の使用について懸念していることを意味します。静的アナライザー(Xcodeの[製品]メニューの[分析]、またはshift+ command+を押して呼び出すB)は、ブリッジングやCoreFoundationなどのリークについてコードを診断するのに優れています。

于 2013-01-05T19:33:26.927 に答える