想過retain和strong的區(qū)別嗎?以前認為他們是一樣的。今天發(fā)現(xiàn)有區(qū)別。
retain和strong的區(qū)別在于修飾block的區(qū)別。我們都知道block應(yīng)該使用copy進行修飾。先說結(jié)果:
在MRC(Manual Reference Counting)下
修飾block時,strong相當于copy。
修飾block時,retain相當于assign。
導(dǎo)致結(jié)果:如果用strong修飾沒有問題,如果用retain修飾會崩潰。報野指針錯誤。
詳解:
在MRC下,block的存儲分為三塊:堆區(qū),棧區(qū),全局區(qū)。在ARC下,block的存儲分為兩塊:全局區(qū),堆區(qū)。
如果在MRC下,我們用全局變量對棧區(qū)的block進行了引用,然后修飾符還是使用的retain或者assign,那么結(jié)果就是后邊使用可能出現(xiàn)野指針訪問壞內(nèi)存。
結(jié)論就是block使用strong或者copy進行修飾最安全。