Block中weak/strong self用法
// 寫法
__weak __typeof(self)weakSelf = self;
block blk = ^() {
__strong __typeof(weakSelf)strongSelf = weakSelf;
}
_ typeof _() __typeof() 是對(duì)c語(yǔ)言的編譯擴(kuò)展付魔,標(biāo)準(zhǔn)C要求會(huì)對(duì)帶有雙下劃線方法或變量進(jìn)行編譯器預(yù)處理
1.typeof()其實(shí)和上面兩者相同,typeof()本質(zhì)上是對(duì)C的擴(kuò)展幔亥,這個(gè)語(yǔ)法來(lái)自于C語(yǔ)言
weak strong 所起的作用
通常這種用法是成對(duì)出現(xiàn)的__ weak __ strong
__weak 是將變量變成弱引用,確保不會(huì)產(chǎn)生循環(huán)引用的問(wèn)題。
__strong 強(qiáng)引用笨使,則是在block整個(gè)運(yùn)行周期內(nèi)防止由于掛載對(duì)象的釋放導(dǎo)致weakSelf被釋放美澳,導(dǎo)致的Crash。
Block詳解
Block本質(zhì)是一個(gè)函數(shù)指針眠饮,指向我們要使用的函數(shù)奥帘,他可以放在棧區(qū), 堆區(qū)仪召, 靜態(tài)區(qū)寨蹋,都是可以被調(diào)用的松蒜。
Block有三種類型
1._NSConcreteGlobalBlock 全局靜態(tài)Block,不會(huì)訪問(wèn)外部的變量已旧,也就是說(shuō)這個(gè)Block沒(méi)有對(duì)外部變量的任何引用秸苗,基本上就是打印邏輯之類或就是內(nèi)部邏輯。
2._NSConcreteStackBlock 保存在棧中的Block运褪,當(dāng)函數(shù)返回時(shí)被銷毀惊楼,不使用copy修飾就相當(dāng)于保存在棧中的Block
3._NSConcreteMallocBlock 保存在堆中的Block,當(dāng)引用計(jì)數(shù)為0時(shí)被銷毀,使用copy修飾就會(huì)保存在堆中
全局靜態(tài)block只有在應(yīng)用被結(jié)束時(shí)才會(huì)被釋放秸讹,保存在棧中的Block他會(huì)隨著函數(shù)調(diào)用結(jié)束被銷毀檀咙,再次調(diào)用就會(huì)產(chǎn)生空指針異常。
保存在堆中的Block會(huì)隨著對(duì)象的銷毀而結(jié)束璃诀,只要對(duì)象不銷毀弧可,我們就可以調(diào)用到在堆中的Block,它會(huì)隨著對(duì)象的銷毀而結(jié)束。
Block存儲(chǔ)區(qū)域問(wèn)題
Block有三種存儲(chǔ)方式: 棧劣欢、全局棕诵、堆。Block對(duì)象中包含一個(gè)ISA屬性氧秘,可以根據(jù)該屬性哦按你算存儲(chǔ)位置年鸳。
注意:在ARC情況下沒(méi)有存在棧上這種情況,只有存在Global以及Malloc這兩種情況丸相,而如果是MRC則確實(shí)存在棧搔确、全局、堆這三種情況灭忠。
有一種比較特殊的存在棧中的Block的情況膳算,就是僅僅只是定義了Block但是并未將其賦值給某一個(gè)變量,此時(shí)它存放在棧內(nèi)存區(qū)域弛作,例如將定義好的的Block存放在數(shù)組中的這種情況涕蜂。
全局Block
1.定義在函數(shù)外部的的Block是Global類型。
2.定義在函數(shù)內(nèi)部且沒(méi)有捕獲任何變量映琳,那么它也是全局的机隙。
3.有操作變量的這種Block則會(huì)存放到堆中,這個(gè)存放過(guò)程是ARC自動(dòng)控制的過(guò)程萨西。
Block的copy操作
1.棧上調(diào)用copy會(huì)復(fù)制到堆上
2.全局block調(diào)用copy什么也不做
3.堆上調(diào)用block引用計(jì)數(shù)增加 // 內(nèi)存釋放和應(yīng)用計(jì)數(shù)強(qiáng)相關(guān)