較短的回答(Short Answer)
這是一個歷史原因,在ARC中不使用Copy,而使用Strong是完全正確的。就像是使用實例變量的時候,是使用local還是global蔬啡。
較長的回答(Long Answer)
和其他的object不一樣,一個block是被存儲在stack上的镀虐,這是一個優(yōu)化的實現(xiàn)箱蟆,這種實現(xiàn)是很必要的。像其他的編譯優(yōu)化一樣刮便,這對code沒有一個直接的影響空猜。這個優(yōu)化在block被創(chuàng)建,作為一個方法的參數(shù)被傳入再被釋放的時候受益于一個一般的案例。block在stack上被創(chuàng)建辈毯,釋放的時候也不需要heap(動態(tài)內(nèi)存池)的調(diào)用坝疼。
把它和局部變量做對比,(a)一個是在stack上創(chuàng)建谆沃,(b)在方法return的時候自動被摧毀,(c)在被調(diào)用的時候钝凶,可以以地址的方式傳入到方法中。在方法return的時候唁影,局部變量的地址不能夠被存儲和使用——已經(jīng)被釋放了耕陷。
但是,如果需要据沈,對象的預(yù)期持續(xù)時間可以比創(chuàng)建的方法長久哟沫。所以不像局部變量,它們被創(chuàng)建在heap上并且在方法創(chuàng)建的時候不會自動釋放锌介,而是取決于局部變量是否被需要嗜诀,是否“需要”是由ARC決定的。
在stack上創(chuàng)建block能得到一些的好處孔祸,但是也會引起一個問題裹虫。如果block想要持續(xù)存在,就像object做的融击,所以在創(chuàng)建它的stack釋放之前它必須要移動到heap上。
當實現(xiàn)的block被第一個釋放雳窟,在stack上strong block的優(yōu)化是可見的對于開發(fā)者尊浪,編譯器在這個時候不能夠自動處理移動block到heap上。當需要的時候封救,開發(fā)者必須自己調(diào)用block_copy
方法拇涤。
但是這個方法只能在底層C的API中使用(block是一個C的結(jié)構(gòu)體),在Object-C的層開發(fā)的開發(fā)者手動管理編譯優(yōu)化不是一個很好的實踐誉结。Apple發(fā)布的最新的編譯器版本改善了這種使用鹅士,較早的開發(fā)者被告訴用[block copy]
替代block_copy(block)
,這符合一般的Object-C的調(diào)用方式。當需要的時候惩坑,編譯器開始自動的從stack拷貝出block掉盅。但是這沒有被官方文檔正式說明。
沒有必要暫時的手動從stack拷貝block以舒,因為Apple不能擺脫歷史的包袱趾痘,只能認為這樣做是best practice,但這也是相當有爭議的蔓钟。在2014年9月最新的版本中永票,蘋果的Workding with Blocks陳述了block屬性應(yīng)該使用copy
,這就立馬變的清晰了。
Note:你應(yīng)該用copy來修飾block屬性侣集。為了追蹤原始作用域捕獲的狀態(tài)键俱,block需要被拷貝。當使用Automatic Reference Counting你就不需要擔心這些世分,因為這會自動發(fā)生编振,但是屬性attribute命名的最佳實踐應(yīng)該是能夠說明它的必然行為。
沒有必要顯示“它必然的行為” - 在stack上的第一個地方存儲block是一個優(yōu)化罚攀,并且對于code來說應(yīng)該是透明可見的党觅。就像其他編譯器優(yōu)化之后,不應(yīng)該需要開發(fā)者做什么就能得到性能的提升斋泄。
個人理解的意思是:編譯器優(yōu)化了之后杯瞻,不應(yīng)該要求使用者將屬性改為copy,使用者只要知道被strong過的block也會想普通對象一樣被ARC管理就行了炫掐。
所以只要你使用ARC魁莉,現(xiàn)在的Clang編譯器,你可以像對待其他對象一樣對待block募胃。因為block是可變的旗唁。這意味著你不需要拷貝他們。相信Apple痹束,他們已經(jīng)在編譯器優(yōu)化的時候幫我們做了這件事检疫。他們鼓勵你拋棄歷史的包袱,copy
不再需要了祷嘶。
有很多地方?jīng)]有翻譯通屎媳,但是為什么用strong代替copy已經(jīng)很清楚了:
之前我們需要手動的用copy
屬性來修飾block,讓block從stack拷貝到heap论巍,保證block在出了作用域之后也能夠讓block繼續(xù)存在烛谊,并且以ARC的方式來決定什么時候釋放在heap上的block。在2014年9月后的一次編譯器優(yōu)化之后嘉汰,如果用strong
修飾block丹禀,編譯器會自動將blcok從stack拷貝到heap上。
對于開發(fā)者來說鞋怀,這就像處理普通對象一樣用strong
來block就行了双泪。
原文:Cocoa blocks as strong pointers vs copy
歡迎指正????????
Object C中的對象存放在Heap上還是Stack上
Object-C只使用heap對象,不使用stack對象密似。
Stack
stack包含了局部變量的存儲的原始內(nèi)存攒读,每個執(zhí)行的thread都有一個stack。當一個方法被called辛友,方法內(nèi)的局部變量的數(shù)據(jù)存儲在stack地址薄扁。當方法return的時候剪返,stack的地址被釋放。所有的這些都會自動發(fā)生邓梅。
Heap
內(nèi)存中的一部分是heap脱盲。在heap的上的內(nèi)存任何時候都能被分配和摧毀。
所以日缨,最后stack上的object的的內(nèi)存地址是在heap被分配的钱反。
原文:where does Objective C store objects, heap or stack [duplicate]
歡迎指正????????