簡體   English   中英

Objective-C:ARC中的塊

[英]Objective-C: blocks in ARC

我正在轉換到ARC(自動引用計數),這個文檔非常有用: 轉換到ARC發行說明 它說:

塊如何在ARC中工作?

在ARC模式下向塊傳遞塊時塊“正常工作”,例如在返回中。 您不必再調用Block Copy。 將堆棧“向下”傳遞給arrayWithObjects:以及其他執行保留的方法時,仍然需要使用[^ {} copy]。

有人可以詳細說明這一點或舉一些例子嗎? 我明白這通常意味着我不需要再進行[塊復制],即使塊在聲明范圍之外使用,因為ARC現在會更加巧妙地處理它,但我仍然需要在我想要時復制它將塊傳遞給保留它的函數。 這個對嗎?

實際上我已經嘗試了一點點,到目前為止,即使我沒有復制將塊傳遞給數組也沒關系,所以這個問題。 謝謝!

讓我們從MRC(手動參考計數)的角度考慮問題。 當您從函數返回堆棧塊時,返回它的副本(通常使用[[ copy] autorelease]始終是正確的做法 這是因為堆棧塊的生命周期是函數調用,它正在結束。 因此,為了使返回的指針在返回后指向有效的塊,當然您必須返回堆副本。

但是,將塊作為參數傳遞給函數或方法呢? 你應該通過它的副本嗎? 這有點復雜。 我們知道,如果你需要存儲一個塊供以后在一個比函數調用更長的地方使用(例如在一個實例變量或全局變量等中),你需要存儲一個塊的副本。 但是我們怎么知道這是真的(如果它是真的,哪個函數(調用者/被調用者)負責復制它)?

通常,當您將其傳遞給參數為塊類型的函數或方法時,您不需要復制它,因為,作為一個帶有塊參數的函數,該函數負責在需要時復制它將它存放在以后。

但是將塊傳遞給參數為非塊類型(如id )的函數或方法呢? 然后該函數不知道它的參數是一個塊,因此只有在需要存儲它以供以后使用時才會保留該對象,而不是復制它。 在這種情況下,如果我們知道函數或方法將存儲對象以供以后使用(例如使用-[NSMutableArray addObject:] ),我們應該傳遞該塊的副本。 我們應該總是傳遞副本嗎? 不必要。 如果我們知道函數或方法不會存儲塊以供以后使用(例如僅打印對象),則制作塊的副本是低效的。

在ARC中,編譯器會嘗試盡可能多地為您執行操作。 因此,在返回堆棧塊(“傳遞它”)的情況下,編譯器知道返回副本總是正確的,所以它隱含地這樣做。 這就是為什么你不再需要自己動手了。

但是,為了將塊傳遞給方法或函數(“傳遞它”),並不總是能夠自動確定是否需要復制,並且額外的復制可能效率低下,因此編譯器不會自動執行任何操作; 而程序員需要弄清楚它。

我注意到在最近版本的編譯器中,ARC會在很多情況下復制塊,我想也許,所以他們可能會將ARC的實現改為幾乎總是復制塊,以便謹慎行事,並且他們認為性能成本並不重要。 因此,它現在可以直接將塊傳遞給addObject:無需顯式復制。 但我相信ARC的情況並非總是如此,並且語言無法保證這一點,或者此行為將在未來保留。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM