web-dev-qa-db-ja.com

iOS 6のdispatch_queue_createとdispatch_releaseについてARCが文句を言うのはなぜですか?

GCDキューを参照するプロパティを宣言しました。

@property (assign) dispatch_queue_t backgroundQueue;

クラスのinitメソッドで、シリアルキューを作成します。

backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL);

ARCは、「保持されたオブジェクトをunsafe_unretained変数に割り当てます。オブジェクトは割り当て後に解放されます」と文句を言います。

__bridge_transferを使用する必要がありますか?

-deallocで、キューを解放しています。

dispatch_release(backgroundQueue);

繰り返しになりますが、ARCは次のように文句を言います。「ARCは「リリース」の明示的なメッセージ送信を禁止しています」

これはC関数呼び出しであり、思考キューはCオブジェクトであり、メモリ管理を自分で行う必要があるため、これは混乱を招きます。 ARCはいつからCオブジェクトを処理しますか?

19
openfrog

IOS 6では、cmd +クリックしてdispatch_queue_tを実行して次を確認できます。

/*
 * By default, dispatch objects are declared as Objective-C types when building
 * with an Objective-C compiler. This allows them to participate in ARC, in RR
 * management by the Blocks runtime and in leaks checking by the static
 * analyzer, and enables them to be added to Cocoa collections.
 * See <os/object.h> for details.
 */

したがって、プロパティでstrongを使用するだけです(キューが他の場所で参照されていて、本当に弱い参照が必要な場合を除く)。

IOS 6より前は、dispatch_retainとdispatch_releaseを使用して自分でメモリ管理を行う必要があります。 iOS 6でこれを行うと、コンパイラエラーがスローされます。

39
Jano

このエラーメッセージは、iOS 6SDKを使用している場合に表示されます。

iOS 6.0 SDKMac OS X 10.8 SDKでは、すべてのディスパッチオブジェクトもObjective Cの一部です。したがって、メモリについて心配する必要はありません。ARCがdispatch_queueのメモリを管理します。

詳しくは link をご覧ください。

9
Midhun MP

assignの使用を主張しないでください。次を使用できます。

@property (nonatomic) dispatch_queue_t backgroundQueue;

あるいは

@property dispatch_queue_t backgroundQueue;

警告なし。

3
Dan Rosenstark

魔法dispatch_retainおよびdispatch_release関数は多くの条件に基づいて定義されます。

私のテストの結論:-sdk 5にデプロイする場合は、それらを使用し、すべてが順調です-sdk> = 6にデプロイする場合は、それらについて考えずに、すべてをオブジェクトとして扱います。

あなたはここでより良い説明を見ることができます: https://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues?rq=1

1
Mihai Timar