Block介紹
iOS中的block類似于C++的成員函數(shù)指針祷杈,也類似于JS中的lambada函數(shù)诉字,本質(zhì)上就是一個(gè)OC的對象孤里,繼承自NSBlock黄选,用于存儲函數(shù)的上下文以及調(diào)用環(huán)境蝇摸。
Block分為三種類型
全局NSConreateGlobalBlock
? ? 不訪問外部變量的block
棧Block?NSConcreateStackBlock
? ? 訪問外部變量但未進(jìn)行copy的block為棧block
堆Block?NSConcreateMallocBlock
? ? block內(nèi)的數(shù)據(jù)修改的時(shí)候膊畴,需要進(jìn)行__block修飾的block或者訪問外部變量進(jìn)行copy的block
Block三種修飾符的作用
__block
? ? block默認(rèn)局部變量是不能進(jìn)行修改操作的眉反,是只讀的這,想要進(jìn)行修改就需要通過__block去修飾虏等,block體的局部變量默認(rèn)是值拷貝民镜,跟外部的局部變量內(nèi)存地址不一樣啡专,所以為什么block內(nèi)的布局變量是可以讀的但不能寫,通過__block將局部變量生成一個(gè)block結(jié)構(gòu)體制圈,將結(jié)構(gòu)體中的forwarding指針指向block體內(nèi)的對象们童,從而進(jìn)行對象的操作畔况。
__weak
? ? 常用于解決self強(qiáng)引用block,block強(qiáng)引用self導(dǎo)致循環(huán)引用問題慧库,通過__weak對self進(jìn)行弱引用跷跪,從而達(dá)到解決循環(huán)引用的問題。
__strong
? ? 提高安全性齐板,防止被其他線程提前釋放吵瞻。
Block的copy操作
? ? 堆block
? ? 引用計(jì)數(shù)器會加1
? ? 棧block
? ? 從棧內(nèi)存拷貝到堆內(nèi)存
? ? 全局block
? ? 什么也不做
? ??
? ??