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

根據我的經驗,Apple文檔總是提到你需要管理它的必要版本。通常,具有執行釋放的特定功能。在這種情況下,閱讀文檔,它看起來取決於您是否需要自己管理版本。我認爲如果你使用dispatch_retain並持有一個指針,你需要自己釋放它。儘管如此,我還沒有使用過這個功能,所以請帶上一點鹽。 –

回答

7

不,前提是您的部署目標是iOS 6.0或Mac OS X 10.8或更高版本,如here所述。

所有GCD對象都由ARC管理,因此您不需要明確管理其內存。 dispatch_queue_t也適用於所有其他GCD對象。

這記錄在<os/object.h>正上方OS_OBJECT_HAVE_OBJC_SUPPORT的定義之上。

默認情況下,使用Objective-C編譯器構建時,諸如GCD和XPC對象之類的libSystem對象被聲明爲Objective-C類型。這允許他們參與ARC,由RR運行時管理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 
相關問題