帶你認(rèn)識(shí)iOS block

定義

帶有局部變量的匿名函數(shù)恰响。

標(biāo)志

^

使用

跟函數(shù)很像:

1、可以保存代碼涌献;

2胚宦、可以有返回值;

3、可以有形參枢劝;

4井联、調(diào)用方式一樣;


無參無返回值的block


有參無返回值的block


有參有返回值類型的block


使用typedef定義block類型

存儲(chǔ)區(qū)域

三種存儲(chǔ)方式:棧您旁、全局烙常、堆。

優(yōu)點(diǎn)

幫助組織獨(dú)立的代碼段被冒,提高代碼的復(fù)用性和可讀性。

實(shí)現(xiàn)機(jī)制

方法回調(diào)轮蜕。

(所謂回調(diào)昨悼,是在某個(gè)事件發(fā)生前預(yù)先準(zhǔn)備好的一段代碼,相應(yīng)的事件一旦發(fā)生跃洛,系統(tǒng)就會(huì)執(zhí)行這段代碼率触。)

特性

捕獲變量。

概念

當(dāng)某個(gè)block對(duì)象訪問了一個(gè)在該block對(duì)象之前聲明的變量時(shí)汇竭,可以稱該block對(duì)象捕獲了這個(gè)變量葱蝗。一旦block對(duì)象捕獲了某個(gè)變量,該變量之后的變化就不會(huì)對(duì)捕獲后的變量產(chǎn)生任何影響细燎。

實(shí)質(zhì)

默認(rèn)情況下两曼,在block中訪問的外部變量是復(fù)制過去的,即:寫操作不對(duì)原變量生效玻驻。

原因

Apple這樣設(shè)計(jì)應(yīng)該是考慮到了block的特殊性悼凑,block也屬于“函數(shù)”的范疇,變量進(jìn)入block璧瞬,實(shí)際就是已經(jīng)改變了作用域户辫。在幾個(gè)作用域之間進(jìn)行切換時(shí),如果不加上這樣的限制嗤锉,變量的可維護(hù)性將大大降低渔欢。

如果需要修改外部變量,怎么實(shí)現(xiàn)

1瘟忱、修改變量為static全局變量奥额;

2、用__block關(guān)鍵字修飾變量访诱;

(__block關(guān)鍵字的底層實(shí)現(xiàn)原理:__block所起到的作用就是只要觀察到該變量被 block 所持有披坏,就將“外部變量”在棧中的內(nèi)存地址放到了堆中。進(jìn)而在block內(nèi)部會(huì)直接引用變量的地址盐数,所以也可以修改外部變量的值棒拂。)

循環(huán)引用問題

block創(chuàng)建前weak化

概念

? ? 在 block 內(nèi)如果需要訪問 self 的方法、變量,建議使用 weakSelf帚屉。

原因

? ? 創(chuàng)建block函數(shù)之前一般需要對(duì)self進(jìn)行weak化谜诫,否則會(huì)造成循環(huán)引用無法釋放,即內(nèi)存泄漏攻旦。

方法

__weak typeof(self) weakSelf = self;

ARC和MRC兩種情況下的weak化:

? ? 1. ARC:通過使用__weak聲明一個(gè)weakself來代替原來的self喻旷,已告訴block內(nèi)部不要對(duì)self進(jìn)行強(qiáng)引用。

? ? 2. MRC:解決方式與上述基本一致牢屋,只不過將__weak關(guān)鍵字換成__block即可且预。

block內(nèi)部需多次訪問要strong化

概念

? ? 如果在 block 內(nèi)需要多次訪問 self,則需要使用 strongSelf烙无。

原因

? ?保證代碼在執(zhí)行到block中锋谐,self不會(huì)被釋放,當(dāng)block執(zhí)行完后截酷,會(huì)自動(dòng)釋放該strongSelf涮拗。在多線程環(huán)境下(block中的weakSelf有可能被析構(gòu)的情況下),需要先將self轉(zhuǎn)為strong指針迂苛,避免在運(yùn)行到某個(gè)關(guān)鍵步驟時(shí)self對(duì)象被析構(gòu)三热。

方法

? __strong typeof(weakSelf) strongSelf = weakSelf; //內(nèi)部strong

經(jīng)典代碼

? weak–strong dance

? (以下代碼來自AFNetworking,堪稱使用weak–strong dance的經(jīng)典)


weak–strong dance


代碼分析

? ? 1. __weak __typeof(self)weakSelf = self:

? ? 為防止callback內(nèi)部對(duì)self強(qiáng)引用三幻,weak一下就漾。

? ? 2.__strong__typeof(weakSelf)strongSelf = weakSelf:

? ? 如果不轉(zhuǎn)成strongSelf而使用weakSelf,后面幾句話中念搬,有可能在第四句執(zhí)行之后self的對(duì)象可能被析構(gòu)掉从藤,然后后面的StausBlock沒有執(zhí)行,導(dǎo)致邏輯錯(cuò)誤锁蠕。

? ? 3. 使用block前對(duì)block判空夷野。

? ? 4. typeof 是一個(gè)一元運(yùn)算,放在一個(gè)運(yùn)算數(shù)之前荣倾,運(yùn)算數(shù)可以是任意類型悯搔。它返回值是一個(gè)字符串,該字符串說明運(yùn)算數(shù)的類型舌仍。即可以根據(jù)typeof()括號(hào)里面的變量妒貌,自動(dòng)識(shí)別變量類型并返回該類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铸豁,一起剝皮案震驚了整個(gè)濱河市灌曙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌节芥,老刑警劉巖在刺,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆害,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚣驼,警方通過查閱死者的電腦和手機(jī)魄幕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颖杏,“玉大人纯陨,你說我怎么就攤上這事×舸ⅲ” “怎么了翼抠?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)获讳。 經(jīng)常有香客問我阴颖,道長(zhǎng),這世上最難降的妖魔是什么赔嚎? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任膘盖,我火速辦了婚禮胧弛,結(jié)果婚禮上尤误,老公的妹妹穿的比我還像新娘。我一直安慰自己结缚,他們只是感情好损晤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著红竭,像睡著了一般尤勋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵宪,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天最冰,我揣著相機(jī)與錄音,去河邊找鬼稀火。 笑死暖哨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凰狞。 我是一名探鬼主播篇裁,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赡若!你這毒婦竟也來了达布?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤逾冬,失蹤者是張志新(化名)和其女友劉穎黍聂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡分冈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年圾另,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕沉。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡集乔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坡椒,到底是詐尸還是另有隱情扰路,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布倔叼,位于F島的核電站汗唱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丈攒。R本人自食惡果不足惜哩罪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巡验。 院中可真熱鬧际插,春花似錦、人聲如沸显设。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捕捂。三九已至瑟枫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間指攒,已是汗流浹背慷妙。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允悦,地道東北人膝擂。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像澡屡,于是被迫代替她去往敵國(guó)和親猿挚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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