block基礎(chǔ)

1. block基本概念

Block是C級別的語法和運(yùn)行時(shí)特性剃袍。Block是一種比較特殊的數(shù)據(jù)類型,它可以保存一段代碼,在合適的時(shí)候取出來調(diào)用寿桨。Block比較類似C函數(shù)司光,但是Block比之C函數(shù)琅坡,其靈活性體現(xiàn)在棧內(nèi)存、堆內(nèi)存的引用残家。Block是蘋果推薦的類型脑蠕,效率高,可以幫助我們組織獨(dú)立的代碼段跪削,并提高復(fù)用性和可讀性谴仙。主要是用來在運(yùn)行中封裝代碼和保存代碼用的,Block可以在任何時(shí)候被執(zhí)行。

從 xcode 4.0 開始碾盐,系統(tǒng)類庫中的函數(shù)越來越多的開始使用 block 作為參數(shù)晃跺,以下是在系統(tǒng)函數(shù)中使用block的部分情況:a.遍歷數(shù)組和字典b.排序c.視圖動(dòng)畫d.結(jié)束回調(diào)e.錯(cuò)誤處理f.多線程等

格式說明:(返回類型)(^塊名稱)(參數(shù)類型列表) = ^(形參列表) {代碼實(shí)現(xiàn)};

如果沒有參數(shù),等號后面參數(shù)列表的()可以省略

2. 需要注意的地方

a. block(代碼塊)是 oc中的一種數(shù)據(jù)類型毫玖,可以被當(dāng)做參數(shù)傳遞掀虎,可以有返回值,是一個(gè)能工作的代碼單元付枫,可以在任何需要的時(shí)候被執(zhí)行烹玉,就像調(diào)用函數(shù)一樣調(diào)用,在 ios 開發(fā)中廣泛使用阐滩。

b. ^ 是 block 的特有的標(biāo)記二打。

c. block? 熟練了解block 的定義(塊代碼的定義),記得實(shí)現(xiàn)代碼包含在 {} 之間掂榔。

d. block 是以內(nèi)聯(lián) inline 函數(shù)的方式被定義使用继效。

e. 本質(zhì)上是輕量級的匿名函數(shù)。

c. 塊代碼的使用注意點(diǎn)

? ?i. 默認(rèn)情況下装获,不允許在塊代碼內(nèi)部修改外部的變量的數(shù)值

? ?ii. __block瑞信,讓外部的變量能夠在block中修改

? ?iii. 循環(huán)引用的問題? __weak (ios5.0以下的版本使用__unsafe_unretained)

? ?iv. 默認(rèn)情況下,block 外部的變量穴豫,在 block 中是只讀的

? v. 塊代碼與代理的區(qū)別(代理和block是IOS上實(shí)現(xiàn)回調(diào)的兩種機(jī)制凡简。Block基本可以代替代理的功能,而且實(shí)現(xiàn)起來比較簡潔,比較推薦能用block的地方不要用代理秤涩;單就編程過程而言,block對開發(fā)者處理邏輯,編程效率,代碼閱讀都有積極影響帜乞。代理是一種很經(jīng)典的模式,我們很多人都已經(jīng)習(xí)慣了這種模式溉仑,若果對block的回調(diào)傳值的過程不是很理解的話挖函,建議使用代理,可以達(dá)到同樣地效果浊竟。)

3.block的修飾

? ?ARC情況下

1.如果用copy修飾Block怨喘,該Block就會存儲在堆空間。則會對Block的內(nèi)部對象進(jìn)行強(qiáng)引用振定,導(dǎo)致循環(huán)引用必怜。內(nèi)存無法釋放。

解決方法:新建一個(gè)指針(__weak typeof(Target) weakTarget = Target )指向Block代碼塊里的對象后频,然后用weakTarget進(jìn)行操作梳庆。就可以解決循環(huán)引用問題。

2.如果用weak修飾Block卑惜,該Block就會存放在椄嘀矗空間,不會出現(xiàn)循環(huán)引用問題露久。

? MRC情況下

用copy修飾后更米,如果要在Block內(nèi)部使用對象,則需要進(jìn)行(__block typeof(Target) blockTarget = Target )處理毫痕。在Block里面用blockTarget進(jìn)行操作征峦。

4.關(guān)于block引用外部變量操作的問題

block 使用,如果引用了外部變量消请,就會對外部變量做一個(gè)copy的操作,記錄住定義block時(shí)候的值栏笆。如果后續(xù)再修改外部變量的值,不會影響block內(nèi)部的數(shù)值的變化臊泰。

外部變量本來是在棧區(qū)中蛉加,block引用的那一刻,就將外部變量copy 到堆區(qū)中了因宇,block里面使用的時(shí)copy 后堆中的變量的值七婴。

所有在block 調(diào)用之前修改外部變量的值,不會影響block里面值的原因察滑。

(如果要驗(yàn)證:可以通過打印地址值的方式來驗(yàn)證,棧區(qū)是高位地址值修肠,相對于棧贺辰,堆在低位地址。通過打印地址發(fā)現(xiàn),block里面的變量的地址值比block外面的地址值要小很多饲化。)

在默認(rèn)的情況下莽鸭,是不允許在block內(nèi)部修改外部變量的值。(原因是:會破壞代碼的可讀性吃靠,不易于維護(hù))

如果我們一定要在block的內(nèi)部修改外部變量的值硫眨,必須在外部變量的前面添加 _ _block ,這樣才會允許修改巢块。使用__block礁阁,說明不再關(guān)心外部變量數(shù)值的具體變化。

為什么使用__block 會達(dá)到這個(gè)效果(可以通過跟蹤地址值發(fā)現(xiàn)問題)族奢?

在定義block時(shí)姥闭,如果引用了外部變量使用了__block的變量。block定義之后越走,外部變量同樣會被copy到堆中棚品,不同的是棧中的那一份沒有了,只保留了堆中的那一份廊敌。在block 中修改的那一份和保留的那一份是同一份铜跑,所以可以修改。

5.block的類型

block有幾種不同的類型骡澈,這里列出常見的三種類型:

_NSConcreteGlobalBlock:全局的靜態(tài)block锅纺,不會訪問任何外部變量,不會涉及到任何拷貝秧廉,比如一個(gè)空的block伞广。它既不在棧中,也不在堆中疼电,我理解為它可能在內(nèi)存的全局區(qū)嚼锄。

_NSConcreteStackBlock:保存在棧中的block,當(dāng)函數(shù)返回時(shí)被銷毀蔽豺。_NSConcreteStackBlock類型的block有閉包行為区丑,也就是有訪問外部變量,并且該block只且只有有一次執(zhí)行修陡,因?yàn)闂V械目臻g是可重復(fù)使用的沧侥,所以當(dāng)棧中的block執(zhí)行一次之后就被清除出棧了,所以無法多次使用魄鸦。

_NSConcreteMallocBlock:保存在堆中的block宴杀,當(dāng)引用計(jì)數(shù)為0時(shí)被銷毀。該類型的block都是由_NSConcreteStackBlock類型的block從棧中復(fù)制到堆中形成的拾因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旺罢,一起剝皮案震驚了整個(gè)濱河市旷余,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扁达,老刑警劉巖正卧,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跪解,居然都是意外死亡炉旷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門叉讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窘行,“玉大人,你說我怎么就攤上這事节吮〕楦撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵透绩,是天一觀的道長翘骂。 經(jīng)常有香客問我,道長帚豪,這世上最難降的妖魔是什么碳竟? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狸臣,結(jié)果婚禮上莹桅,老公的妹妹穿的比我還像新娘。我一直安慰自己烛亦,他們只是感情好诈泼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著煤禽,像睡著了一般铐达。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檬果,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天瓮孙,我揣著相機(jī)與錄音,去河邊找鬼选脊。 笑死杭抠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恳啥。 我是一名探鬼主播偏灿,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钝的!你這毒婦竟也來了菩混?” 一聲冷哼從身側(cè)響起忿墅,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤扁藕,失蹤者是張志新(化名)和其女友劉穎沮峡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿柑,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邢疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了望薄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疟游。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痕支,靈堂內(nèi)的尸體忽然破棺而出颁虐,到底是詐尸還是另有隱情,我是刑警寧澤卧须,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布另绩,位于F島的核電站,受9級特大地震影響花嘶,放射性物質(zhì)發(fā)生泄漏笋籽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一椭员、第九天 我趴在偏房一處隱蔽的房頂上張望车海。 院中可真熱鬧,春花似錦隘击、人聲如沸侍芝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州叠。三九已至,卻和暖如春莺禁,著一層夾襖步出監(jiān)牢的瞬間留量,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工哟冬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楼熄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓浩峡,卻偏偏與公主長得像可岂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子翰灾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容