iOS Block理解

1诉植、什么是Block

帶有自動(dòng)變量(局部變量)的匿名函數(shù)昵观。
Block實(shí)質(zhì)就是Objective-C對(duì)象晾腔。

2灼擂、Block語(yǔ)法

^【返回值類型】【參數(shù)列表】【表達(dá)式】
exp. ^int (int count) {return count + 1;}
注意:【返回值類型】和【參數(shù)列表】可省略

3、Block類型變量

exp. 
{
        int (^blk)(int) = ^int (int count) {return count + 1;}
        blk(1);
    }
         
    {
        typedef int (^blk_t)(int);
        blk_t blk = ^int (int count) {return count + 1;}
        blk(1);
    }

4觉至、截獲自動(dòng)變量值

int main() {
        int val = 10;
        const char *str = "val = %d\n";
        void (^blk)(void) = ^{printf(str, val);};
        
        val = 2;
        str = "new val = %d\n";
        
        blk();
        
        return 0;
    }
輸出結(jié)果:val = 10;
分析:block截獲自動(dòng)變量val和str的瞬時(shí)值剔应,并保存在自己的結(jié)構(gòu)體中,block外部再改變自動(dòng)變量的值不影響block自身保存的值康谆。

5领斥、__block說明符

自動(dòng)變量截獲只能保存瞬時(shí)值,保存后就不能改寫沃暗,當(dāng)嘗試在Block中改寫截獲的自動(dòng)變量值,就會(huì)報(bào)錯(cuò)何恶。
但是孽锥,用__block修飾自動(dòng)變量后,就可在Block中改寫了细层。

6惜辑、Block實(shí)質(zhì)

Block實(shí)質(zhì)就是Objective-C對(duì)象。并且Block的類有以下三種:
①_NSConcreteStackBlock(棧)
②_NSConcreteGlobalBlock(程序的數(shù)據(jù)區(qū)域(.data區(qū)))
③_NSConcreteMallocBlock(堆)

生成的Block為_NSConcreteGlobalBlock類對(duì)象的兩種情況:
    1.在定義全局變量的地方使用Block語(yǔ)法時(shí)疫赎。
    2.Block語(yǔ)法的表達(dá)式中不使用截獲的自動(dòng)變量時(shí)盛撑。
且設(shè)置在程序的數(shù)據(jù)區(qū)域中。
除了上面的兩種情況捧搞,Block語(yǔ)法生成的Block為_NSConcreteStackBlock類對(duì)象抵卫,且設(shè)置在棧上狮荔。

設(shè)置在全局變量上的Block即使在變量作用域外也可以用指針安全地訪問,但是設(shè)置在棧上的Block當(dāng)其所屬的變量作用域結(jié)束時(shí)就會(huì)被廢棄介粘,無(wú)法再訪問殖氏。
解決方法:將Block從棧上復(fù)制到堆上。

在ARC開啟時(shí)姻采,以下四種情況系統(tǒng)會(huì)自動(dòng)將Block從棧上復(fù)制到堆上雅采。
    1.將Block作為函數(shù)返回值。
    2.向方法或函數(shù)的參數(shù)中傳遞Block慨亲。
    3.將Block賦值給附有__strong修飾符id類型的類或Block類型成員變量婚瓜。
    4.Cocoa框架的方法且方法名中含有usingBlock或GCD的API。
其他情況需要手動(dòng)復(fù)制刑棵。

不同情況調(diào)用copy的效果:
    1._NSConcreteStackBlock→copy→從棧復(fù)制到堆
    2._NSConcreteGlobalBlock→copy→什么也不做
    3._NSConcreteMallocBlock→copy→引用計(jì)數(shù)增加
注意:不管Block配置在何處巴刻,用copy方法復(fù)制不會(huì)有任何問題,在不確定時(shí)調(diào)用copy即可铐望。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冈涧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子正蛙,更是在濱河造成了極大的恐慌督弓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒验,死亡現(xiàn)場(chǎng)離奇詭異愚隧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锻全,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門狂塘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳄厌,你說我怎么就攤上這事荞胡。” “怎么了了嚎?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵泪漂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我歪泳,道長(zhǎng)萝勤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任呐伞,我火速辦了婚禮敌卓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伶氢。我一直安慰自己趟径,他們只是感情好瘪吏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舵抹,像睡著了一般肪虎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惧蛹,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天扇救,我揣著相機(jī)與錄音,去河邊找鬼香嗓。 笑死迅腔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠娱。 我是一名探鬼主播沧烈,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼像云!你這毒婦竟也來了锌雀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迅诬,失蹤者是張志新(化名)和其女友劉穎腋逆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侈贷,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惩歉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俏蛮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撑蚌。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搏屑,靈堂內(nèi)的尸體忽然破棺而出争涌,到底是詐尸還是另有隱情,我是刑警寧澤辣恋,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布第煮,位于F島的核電站,受9級(jí)特大地震影響抑党,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撵摆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一底靠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧特铝,春花似錦暑中、人聲如沸壹瘟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稻轨。三九已至,卻和暖如春雕凹,著一層夾襖步出監(jiān)牢的瞬間殴俱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工枚抵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留线欲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓汽摹,卻偏偏與公主長(zhǎng)得像李丰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逼泣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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