12

(しかし、この質問は全く異なる)ARCでdispatch_releaseを呼び出す必要がありますか?

この非ARCのコード例は、GCDベースのタイマーを設定し、それがdispatch_source_tオブジェクトに対してdispatch_releaseを呼び出す:私はあなたが行うことを学んだ

__block BOOL done = NO; 
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); 
    if (timer) { 
     uint64_t milliseconds = 100ull; 
     uint64_t interval = milliseconds * NSEC_PER_MSEC; 
     uint64_t leeway = 10ull * NSEC_PER_MSEC; 
     __block typeof(self) _self = self; 

     dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway); 
     dispatch_source_set_event_handler(timer, ^{ 
      //[_progressBar setProgress:exportSession.progress animated:YES]; 
      if (done) { 
       dispatch_source_cancel(timer); 
       dispatch_release(timer); 
       _self.exportingMovieLabel.hidden = YES; 
       _self.exportingProgress.hidden = YES; 
      } 
     }); 

     dispatch_resume(timer); 
    } 

ARCの下でキューオブジェクトを解放する必要はありません。しかし、ディスパッチソースのような他のGCDオブジェクトは?

+1

主張されている「重複した質問」は、近くでさえありません。答えは特にGCDキューについて話します。この質問は、これが他のGCDオブジェクトに当てはまるかどうかを具体的に質問します。 – openfrog

+2

試してみてください。それが必要でないなら、コンパイラはあなたにあなたをさせません(そうではありません)。 –

+1

私の経験では、アップルのマニュアルには常に、そのリリースを管理する必要があることが記載されています。通常、リリースを行うための特定の機能があります。この場合、ドキュメントを読むと、自分でリリースを管理する必要があるかどうかは、使用方法によって異なるように見えます。私はあなたがdispatch_retainを使用してポインタを保持している場合は、これを自分自身で解放する必要があることを意味します。私はこの機能を使用していませんが、塩の穀物でこれをとってください。 –

答えて

7

いいえ、デプロイターゲットがhereのようにiOS 6.0またはMac OS X 10.8以降であることを条件とします。

すべてのGCDオブジェクトはARCによって管理されるため、明示的にメモリを管理する必要はありません。 dispatch_queue_tで真であるのは、他のすべてのGCDオブジェクトにも当てはまります。

これは、OS_OBJECT_HAVE_OBJC_SUPPORTの定義の上の<os/object.h>に記載されています。

デフォルトでは、GCDやXPCオブジェクトなどのlibSystemオブジェクトは、Objective-CコンパイラでビルドするときにObjective-Cタイプとして宣言されます。これにより、ARC、BlocksランタイムによるRR管理、スタティックアナライザーによるリークチェックに参加し、Cocoaコレクションに追加することができます。

-DOS_OBJECT_USE_OBJC=0コンパイラフラグを使用してこの動作からオプトアウトすることもできます。

1

ここにコードに追加するコンパイラ指令です。

// If GCD objects are treated as Objective C object then we do not need to call dispatch_release on those GCD object. 
// Checking if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 ensures we are only releasing GCD objects when they are NOT being treated as Objective C objects. 
#if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 
    dispatch_release(timer); 
#endif 
関連する問題