1笼呆、block的特點(diǎn):
block是C語(yǔ)言熊响;
block是一種數(shù)據(jù)類型、可以當(dāng)做參數(shù)诗赌,也可以用做返回值
block是預(yù)先準(zhǔn)備好的代碼塊汗茄、在需要的時(shí)候調(diào)用,(需要好好理解“需要時(shí)”)铭若;
2洪碳、定義block
3递览、block引用外部變量
在定義block時(shí),如果使用了外部變量瞳腌,block內(nèi)部會(huì)默認(rèn)對(duì)外部變量做一次copy绞铃;
默認(rèn)情況下,不允許在block內(nèi)部修改外部變量的值嫂侍;
在外部變量聲明時(shí)儿捧,使用__block修飾符,則可以在block內(nèi)部修改外部變量的值挑宠;
4菲盾、數(shù)組的遍歷&排序;
遍歷:enumerateObjectsUsingBlock:
所有的參數(shù)都已經(jīng)準(zhǔn)備到位各淀,可以直接使用
效率比f(wàn)or高懒鉴,官方推薦使用;
舉例:懶加載
enumerateObjectsUsingBlock遍歷:
[tempArrayenumerateObjectsUsingBlock:^(id_Nonnullobj,NSUIntegeridx,BOOL*_Nonnullstop) {
NSDictionary*dict = (NSDictionary*)obj;
Heros*hero = [HerosherosWithDict:dict];
[ArrMaddObject:hero];
}];
for—IN遍歷:
for(NSDictionary*dictintempArray) {
Heros*heros = [HerosherosWithDict:dict];
[ArrMaddObject:heros];
}
排序:sortedArrayUsingComparator:
5.block在內(nèi)存中的位置
?Block如果沒(méi)有引用外部變量
保存在全局區(qū)(MRC/ARC一樣)
?Block如果引用外部變量
ARC保存在堆區(qū)碎浇;MRC保存在棧區(qū)必須用copy修飾block临谱;
block快的存儲(chǔ)位置(block入口的地址)可能存放在3個(gè)地方:代碼區(qū)(全局區(qū))、堆區(qū)南捂、棧區(qū)(ARC情況下會(huì)自動(dòng)拷貝到堆區(qū)吴裤、因此ARC下只有兩個(gè)地方:代碼區(qū)和堆區(qū))旧找。
?代碼區(qū):不訪問(wèn)出去棧區(qū)的變量(如局部變量)溺健,且不訪問(wèn)堆區(qū)的變量(如用alloc創(chuàng)建的對(duì)象)時(shí),此時(shí)block存放在代碼區(qū)钮蛛;
?堆區(qū):如果訪問(wèn)了處于堆區(qū)的變量(如局部變量)鞭缭,或堆區(qū)的變量(如用alloc創(chuàng)建的對(duì)象),此時(shí)block存放在堆區(qū)
6.block的循環(huán)引用
block對(duì)于其變量都會(huì)形成strong reference魏颓,對(duì)于self也會(huì)形成strong reference岭辣,而如果self本身對(duì)block也是strong reference的話,就會(huì)形成strong reference循環(huán)甸饱,造成內(nèi)存泄露沦童。
解決方法:一般在block外面加一句—week typeof(self)weekSelf = self;防止self在block中應(yīng)用計(jì)數(shù)加1,導(dǎo)致self和block循環(huán)引用無(wú)法釋放內(nèi)存,造成內(nèi)存泄露叹话。