2012-06-27 48 views
1

我有這樣的代碼,我有一些任務我想做並行,問題是電影對象是在每個運行循環上發佈才能處理它。有沒有辦法在ARC中保留這一點?現在我將大部分邏輯處理到dispatch中,並使用__block傳遞它,但是如果這是一個耗時的過程,並且希望在dispatch塊中處理它,我應該怎麼做?如何保留傳遞給ARC中的塊的對象

for (HTMLNode *movie in movieContainer) { 
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// time consuming process on movie object 
}); 

dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // combine the results 
}); 

回答

3

大多數時候,你不必。塊會自動捕獲默認使用的所有變量,但是,使用快速迭代時,會出現異常。

由於快速迭代使用__unsafe_unretained原始指針,而不是強勢者(速度),你可以簡單地用強資格的迭代變量在這種情況下:

for (HTMLNode __strong *movie in movieContainer) { 
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// time consuming process on movie object 
}); 
+0

事實證明,HTMLNode不是零,但它的孩子呢。我使用https://github.com/zootreeves/Objective-C-HMTL-Parser你有一些想法可能會出錯嗎? – sarunw

0

創建一個局部變量與關鍵字__strong並影響它的電影對象。然後在你的dispatch_async調用中使用這個強大的局部變量。

-1

手動保留釋放

#import <objc/runtime.h> 
id objc_retain(id); 
void objc_release(id); 

objc_retain(object); 
objc_release(object); 

變量與

__strong 
+0

一個非常糟糕的主意。切勿使用'objc_retain'。它會將ARC發送到地獄洞,因爲它不指望你做這樣的事情。 –

+0

有沒有其他選擇的情況下,但有__strong更好 –

+1

總是有更好的選擇。即使它涉及一個臨時的強大對象,在使用ARC(而不是使用CFObjects)時,也不應該嘗試將引用計數放到你的手中。 –

相關問題