一.block簡介
1.block是一段代碼塊鸠珠,是對c語言的拓展巍耗,用來封裝或者存儲代碼,與函數(shù)類似渐排,可以在需要的時候需要的文件中調(diào)用
2.block分為有參數(shù)有返回值炬太,有參數(shù)無返回值,無參數(shù)有返回值驯耻,無參數(shù)無返回值.
block的聲明格式:
//無參數(shù)無返回值
有參數(shù)的block可以有多個參數(shù)亲族,參數(shù)之間使用“,”隔開可缚。
此時run程序會發(fā)現(xiàn)并不會有打印結(jié)果霎迫,必須要調(diào)用之后才能執(zhí)行block的代碼塊
block的調(diào)用
3.在block內(nèi)部可以訪問外部變量,默認(rèn)情況下不可以修改此外部變量的值:
如果想要在block內(nèi)部修改外部變量需要用__block修飾外部變量
4.利用類型定義定義block知给,這樣可以寫起來更簡單、方便
二.block使用場景
1.block屬性描姚,可以在類之間傳遞一段代碼并實現(xiàn)回調(diào)功能
新建一個Person類并聲明一個block類型的屬性
可以在Person的init方法中或者viewcontroller類中給這個block封裝一段代碼涩赢,然后調(diào)用。
本文在viewcontroller類中封裝轩勘,在Person中可以實現(xiàn)調(diào)用筒扒,就起到了類和類之間傳遞信息的作用
2.block可以作方法的參數(shù),AFNetworking庫中的請求方法中一般都有block的參數(shù)赃阀,本文中將給Person類添加一個帶有block參數(shù)的方法
然后在viewcontroller中就可以調(diào)用此方法霎肯,并將參數(shù)code傳遞到viewcontroller中擎颖,在viewcontroller中就可以利用code做需要做的事情,實現(xiàn)了事件和值的傳遞
3.block可以作為方法的返回值
本文中將給Person類添加一個返回值為block類型的方法
在viewcontroller中可以聲明一個block去接收這個返回值观游,也可以直接使用這個返回值搂捧,并傳遞參數(shù)給這個block
三、對block的相關(guān)總結(jié)
1.block可以用來進(jìn)行事件或值的傳遞懂缕,是一種回調(diào)機制允跑,是一種蘋果推薦的類型,效率高搪柑。
2.使用block會引起循環(huán)引用聋丝,引起循環(huán)引用的根源是block和object的互相強引用、誰也釋放不了誰工碾,例如在使用ASI進(jìn)行網(wǎng)絡(luò)請求時弱睦,request強引用competionBlock,而在competionBlock中又使用了request渊额,對request也進(jìn)行了強引用况木,這樣就會造成循環(huán)引用。
解決循環(huán)引用的辦法是使用弱引用打斷retain cycle,使用__block修飾request
request被持有者釋放后旬迹。request 的retainCount變成0,request被dealloc火惊,request釋放持有的Block,導(dǎo)致Block的retainCount變成0奔垦,也被銷毀屹耐。這樣這兩個對象內(nèi)存都被回收。