iOS---Block總結(jié)

Q: 什么是Block旱捧?
A: Block是將函數(shù)及其執(zhí)行上下文封裝起來(lái)的對(duì)象潘悼。

Q: 怎樣理解Block調(diào)用衡载?
A: Block調(diào)用就是函數(shù)的調(diào)用

Q: Block的一大特性是截獲變量阔蛉,那么系統(tǒng)關(guān)于Block截獲變量是怎樣實(shí)現(xiàn)的瓣喊?
Q: 會(huì)使用__block修飾符花履,這修飾符用于做什么芽世?
Q: 什么時(shí)候需要對(duì)Block進(jìn)行copy操作?
Q: 棧Block诡壁,堆Block是否了解济瓢?


image.png
image.png
image.png

isa指針,是Block是對(duì)象的標(biāo)志
FuncPtr是函數(shù)指針妹卿,會(huì)指向具體的函數(shù)實(shí)現(xiàn)旺矾。
通過(guò)函數(shù)指針,得到相應(yīng)的函數(shù)執(zhí)行體夺克。


image.png

截獲變量

image.png
image.png

Q:對(duì)Block截獲變量的特性是否有了解箕宙?
A:
1).對(duì)于基本數(shù)據(jù)類型的局部變量截獲其值 (值類型)
2).對(duì)于對(duì)象類型的局部變量連同所有權(quán)修飾符一起截獲(例如__unsafe_unretained id unsafe_obj = nil;
__strong id strong_obj = nil; 循環(huán)引用跟所有權(quán)修飾符一起截獲是有關(guān)的)
3).以指針形式截獲局部靜態(tài)變量(引用類型)
4).不截獲全局變量,靜態(tài)全局變量

__block修飾符

  • 一般情況下铺纽,對(duì)被截獲變量進(jìn)行賦值操作柬帕,需要加__block修飾符


    image.png

1.使用,不需要__block


image.png

2.賦值室囊,需要__block


image.png

3.對(duì)變量賦值雕崩,需要__block


image.png

4.對(duì)變量賦值,不需要__block


image.png

__block修飾的變量變成了對(duì)象

image.png
image.png

棧上的__forwarding指針指向自己融撞。

__forwarding指針是用來(lái)做什么的盼铁?

Block內(nèi)存管理

image.png
image.png

Q:何時(shí)需要對(duì)block進(jìn)行copy操作?

image.png

對(duì)于不同類型的block尝偎, copy的結(jié)果也不一樣饶火。


image.png
image.png

Q:當(dāng)對(duì)棧上block進(jìn)行copy操作后,在MRC環(huán)境下致扯,是否會(huì)引起內(nèi)存泄漏呢肤寝?
A:會(huì)。copy操作后抖僵, 堆上的block沒(méi)有其他額外的成員變量指向它鲤看,跟alloc出一個(gè)對(duì)象,沒(méi)有給出相應(yīng)的release操作一樣耍群,產(chǎn)生內(nèi)存泄漏义桂。

棧上__block變量的copy

image.png

Q:棧上的__forwarding指針的用處?
A: 棧上的__forwarding指針指向的是堆上的block變量蹈垢,堆上的__forwarding指針指向的是自身慷吊。


image.png

如果要修改棧上block,如果做過(guò)copy操作曹抬,實(shí)際上修改的就不是棧上的__forwarding對(duì)應(yīng)的值溉瓶,而是通過(guò)通過(guò)棧上block的__forwarding指針找到堆上的__forwarding變量,然后對(duì)堆上的multiplier值進(jìn)行修改,比如改成4堰酿。
同樣的疾宏,如果是__block變量,由于被成員變量持有触创,當(dāng)我們?cè)谄渌胤秸{(diào)用__block變量的修改灾锯,實(shí)際是通過(guò)自身的__forwarding指向來(lái)修改的。

__forwarding存在的意義

Block循環(huán)引用

image.png
image.png

由于block對(duì)其截獲的變量嗅榕,是連其所有權(quán)修飾符一并截獲顺饮。
因此,block內(nèi)部的持有的變量凌那,也是__weak類型兼雄。

Q:以下代碼有什么問(wèn)題?


image.png

A:在MRC下帽蝶,不會(huì)產(chǎn)生循環(huán)引用赦肋,在ARC下,會(huì)產(chǎn)生循環(huán)引用励稳,引起內(nèi)存泄漏佃乘。

image.png
image.png

這個(gè)解決方案的原理是,在block內(nèi)部把blockSelf置為nil驹尼,從而斷開(kāi)了對(duì)對(duì)象的持有趣避。但是有一點(diǎn)很重要,如果一直不調(diào)用block, 就沒(méi)機(jī)會(huì)斷開(kāi)對(duì)象的持有新翎,也就無(wú)法解決循環(huán)引用了

總結(jié)

Q:為什么block會(huì)產(chǎn)生循環(huán)引用程帕?
A:當(dāng)前block對(duì)當(dāng)前某一對(duì)象進(jìn)行截獲,block會(huì)對(duì)對(duì)應(yīng)變量強(qiáng)引用地啰,當(dāng)前block又由于當(dāng)前對(duì)象對(duì)其有一個(gè)強(qiáng)引用愁拭,因此就產(chǎn)生了一種自循環(huán)引用的循環(huán)引用問(wèn)題,可以聲明為_(kāi)_weak變量來(lái)進(jìn)行循環(huán)引用消除亏吝。如果定義了__block修飾符岭埠,一種是在MRC下,MRC不會(huì)產(chǎn)生循環(huán)引用蔚鸥,一種是在ARC下惜论,可以通過(guò)斷環(huán)的方式解除對(duì)應(yīng)循環(huán)引用。有一個(gè)弊端株茶,如果block一直不能被調(diào)用来涨,循環(huán)引用是不能被解除的图焰。

Q:你都遇到過(guò)哪些循環(huán)引用启盛,是怎么解決的?
A:
1). NSTimer
2). block循環(huán)引用, __weak解除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市僵闯,隨后出現(xiàn)的幾起案子卧抗,更是在濱河造成了極大的恐慌,老刑警劉巖鳖粟,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社裆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡向图,警方通過(guò)查閱死者的電腦和手機(jī)泳秀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)榄攀,“玉大人嗜傅,你說(shuō)我怎么就攤上這事¢萦” “怎么了吕嘀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贞瞒。 經(jīng)常有香客問(wèn)我偶房,道長(zhǎng),這世上最難降的妖魔是什么军浆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任棕洋,我火速辦了婚禮,結(jié)果婚禮上乒融,老公的妹妹穿的比我還像新娘拍冠。我一直安慰自己,他們只是感情好簇抵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布庆杜。 她就那樣靜靜地躺著,像睡著了一般碟摆。 火紅的嫁衣襯著肌膚如雪晃财。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天典蜕,我揣著相機(jī)與錄音断盛,去河邊找鬼。 笑死愉舔,一個(gè)胖子當(dāng)著我的面吹牛钢猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轩缤,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼命迈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贩绕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起壶愤,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淑倾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后征椒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娇哆,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年勃救,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碍讨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒙秒,死狀恐怖垄开,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情税肪,我是刑警寧澤溉躲,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站益兄,受9級(jí)特大地震影響锻梳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜净捅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一疑枯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛔六,春花似錦荆永、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至液兽,卻和暖如春骂删,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背四啰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工宁玫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柑晒。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓欧瘪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匙赞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佛掖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 前言:Block 是開(kāi)發(fā)過(guò)程中常用便捷的回調(diào)方式妖碉,本文簡(jiǎn)單介紹 Block 一、Block 簡(jiǎn)介 Block 對(duì)象...
    夢(mèng)蕊dream閱讀 4,731評(píng)論 5 26
  • 前言 Blocks是C語(yǔ)言的擴(kuò)充功能苦囱,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,757評(píng)論 0 23
  • 棧對(duì)象撕彤、堆對(duì)象 棧是一塊保存局部變量或函數(shù)參數(shù)值的內(nèi)存區(qū)域。在現(xiàn)代的操作系統(tǒng)中猛拴,每個(gè)線程都有一個(gè)對(duì)應(yīng)的棧羹铅。當(dāng)函數(shù)調(diào)...
    HoooChan閱讀 2,692評(píng)論 0 14
  • 默認(rèn)情況下职员,在block中訪問(wèn)的外部變量是復(fù)制過(guò)去的,即:寫操作不對(duì)原變量生效跛溉。但是你可以加上 __block 來(lái)...
    sunnyxg0812閱讀 521評(píng)論 0 1
  • iOS的block是對(duì)c語(yǔ)言的一個(gè)擴(kuò)展焊切,它與c語(yǔ)言的函數(shù)指針是相似的,但是兩者也存在以下區(qū)別:1.block的代碼...
    彬至睢陽(yáng)閱讀 361評(píng)論 0 2