20

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オブジェクトを処理しますか?

4

4 に答える 4

39

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でこれを行うと、コンパイラエラーがスローされます。

于 2012-12-04T14:47:54.837 に答える
10

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

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

詳しくはリンク先をご覧ください。

于 2012-12-04T12:55:36.393 に答える
3

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

@property (nonatomic) dispatch_queue_t backgroundQueue;

あるいは

@property dispatch_queue_t backgroundQueue;

警告なし。

于 2013-08-12T21:43:17.730 に答える
1

魔法dispatch_retaindispatch_release機能は、多くの条件に基づいて定義されています。

私のテストの結論: - SDK 5 にデプロイする場合は、それらを使用してください。すべて問題ありません - SDK >= 6 にデプロイする場合は、それらについて考えずに、すべてをオブジェクトとして扱います。

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

于 2014-02-10T11:48:58.593 に答える