block的聲明與實現 ? 形式如下 ?第一種形式
block的聲明與實現
第二種形式 ?先定義個block類型,大多數情況下也采用這種形式
在block中訪問外部變量
如果你在一個block塊中僅僅訪問對象,而不是對他進行修改操作,是沒有任何問題的,但是修改的話就會報錯
訪問外部變量會報錯
根據猜測,在block生成的同時會對內部使用的變量copy一份,可通過打印變量地址得道驗證
改變了內存地址
如果要在block內部使用外部變量,需要在變量前用__block來修飾,那么__block做了什么?通過如下代碼不難發現__block只做了一件事
如果用__block修飾后 ?block內部會使用原先的那份內存 ?否則就會使用拷貝后的內存 ? 原先的那塊內存雖然值改變了 ?但并不影響內部拷貝后內存的值
一點一點擴展:
由此我們可以推測,如果block中使用的是指針,我們可以直接修改,如果不是的話需要用__block
block循環引用:
先來一個循環引用的案例 (編譯器已經警告提示了,會造成內存泄漏)
而下面這段代碼就不會有警告
因為self并為對GCD的這段block代碼產生強引用