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オブジェクトを処理しますか?
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でこれを行うと、コンパイラエラーがスローされます。
このエラーメッセージは、iOS 6SDKを使用している場合に表示されます。
iOS 6.0 SDK
とMac OS X 10.8 SDK
では、すべてのディスパッチオブジェクトもObjective Cの一部です。したがって、メモリについて心配する必要はありません。ARCがdispatch_queue
のメモリを管理します。
詳しくは link をご覧ください。
assign
の使用を主張しないでください。次を使用できます。
@property (nonatomic) dispatch_queue_t backgroundQueue;
あるいは
@property dispatch_queue_t backgroundQueue;
警告なし。
魔法dispatch_retain
およびdispatch_release
関数は多くの条件に基づいて定義されます。
私のテストの結論:-sdk 5にデプロイする場合は、それらを使用し、すべてが順調です-sdk> = 6にデプロイする場合は、それらについて考えずに、すべてをオブジェクトとして扱います。
あなたはここでより良い説明を見ることができます: https://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues?rq=1