我有一個類似的方法:我是否需要複製一個塊,如果我使用它傳遞給它的方法?
- (void)loadStoreWithCompletion:(CompletionBlock)loadCompletion
{
dispatch_queue_t loadQueue = dispatch_queue_create("loadQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(loadQueue, ^{
// ... Do background stuff ...
});
dispatch_async(loadQueue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
loadCompletion();
});
});
dispatch_release(loadQueue);
}
我需要複製的loadCompletion
塊,因爲它只可能會被調用時,這個方法的調用者不再存在,或者是罰款這樣的嗎?
「你應該總是將它們複製到堆中」否,只有當你的函數將它存儲在某個將超過該調用的地方。 – newacct
@newacct:我已經更具體了,通常塊是異步使用的,這就是爲什麼大多數情況下你需要複製它們。我想,如果他們不打電話,那麼你根本就不需要一個街區。 – Jack
但是,如果您將它傳遞給一個函數,並且該函數將該塊存儲以供以後使用並與其執行異步處理,則該函數有責任在必要時複製它。你不需要知道(也不應該關心)被調用的函數做什麼來做正確的事情。 OP的函數不會將該塊存儲在實例變量或函數體內的任何位置。因此,他不需要複製它。在他的職能中發生的事情是重要的。 – newacct