2012-10-04 13 views
20

Paul HegartyコースのiOS 5チュートリアルに続いて、このコードはGCDの使用方法を示すアプリでご覧になれます。どうやらGCDは、マルチスレッド化に関係する問題が、まだオブジェクトがまだ必要であるかどうか予測できないため、リリースを必要とします。iOS 6.0のARCでGCDキューを解放する必要がありますか?

dispatch_async(dowloadQueue, ^{ 
    .... 
    // do some stuff 
    .... 
    }); 
    dispatch_release(dowloadQueue); 

私はiOSの6とXcode 4.5にアップグレードしたと私は を得る "ARCは、明示的な解放を禁止..." 私はiOS5を/ XCodeの下にこのコードをしようとしなかった

メッセージ4.2

これは、ARCがもっと巧みになり、GCDでのリリースがもう必要ないからですか? 私はちょうど誤解しましたか?

答えて

29

Mountain LionとiOS 6.0をターゲットにすると、ARCはディスパッチキューやその他のGCDタイプを管理します。以前のバージョンのOS XまたはiOSをターゲットにしている場合は、GCDタイプを明示的に保持してリリースする必要があります(スレッドの安全性の理由だけでなく、そうでなければメモリがリークします)。しかし、これは新しいOSバージョン。

これは、iOS 6.0をターゲットにしているときにARCでこのようなコンパイラエラーが発生する理由です。

+0

キューを作成するときにObjective-Cに__bridge_transferする必要がありますか? – openfrog

+0

@openfrog - いいえ、それがObjective-Cオブジェクトとして扱われている場合は、すでにARCによって処理されているので、それを転送する必要はありません。 –

+0

@BradLarsonこれをオフに切り替える方法はありますか?または、iOS 5とiOS 6の両方でコンパイルするにはどうすればいいですか? – fishinear

関連する問題