block的聲明與實(shí)現(xiàn) ? 形式如下 ?第一種形式
第二種形式 ?先定義個(gè)block類型,大多數(shù)情況下也采用這種形式
在block中訪問外部變量
如果你在一個(gè)block塊中僅僅訪問對(duì)象,而不是對(duì)他進(jìn)行修改操作,是沒有任何問題的符匾,但是修改的話就會(huì)報(bào)錯(cuò)
根據(jù)猜測(cè)被环,在block生成的同時(shí)會(huì)對(duì)內(nèi)部使用的變量copy一份,可通過打印變量地址得道驗(yàn)證
如果要在block內(nèi)部使用外部變量延刘,需要在變量前用__block來修飾,那么__block做了什么匹层?通過如下代碼不難發(fā)現(xiàn)__block只做了一件事
如果用__block修飾后 ?block內(nèi)部會(huì)使用原先的那份內(nèi)存 ?否則就會(huì)使用拷貝后的內(nèi)存 ? 原先的那塊內(nèi)存雖然值改變了 ?但并不影響內(nèi)部拷貝后內(nèi)存的值
一點(diǎn)一點(diǎn)擴(kuò)展:
由此我們可以推測(cè),如果block中使用的是指針蛾号,我們可以直接修改稠项,如果不是的話需要用__block
block循環(huán)引用:
先來一個(gè)循環(huán)引用的案例 (編譯器已經(jīng)警告提示了,會(huì)造成內(nèi)存泄漏)
而下面這段代碼就不會(huì)有警告
因?yàn)閟elf并為對(duì)GCD的這段block代碼產(chǎn)生強(qiáng)引用