Block基礎知識點

相信有很多小伙伴跟我一樣糊啡,一直對 block 相交不深柱彻,雖然項目中可以使用豪娜,但還是了解的是不很透徹,今天就來解開這個心結哟楷。


圖片來自官網(wǎng)

文章介紹脈絡:

一瘤载,block 基礎知識
二,block 與 typedef
三卖擅,block與外部變量
四鸣奔,棧block與堆block

一,block 基礎知識

block包括兩部分:函數(shù)塊部分與變量部分

1惩阶,函數(shù)塊部分

函數(shù)塊用^符號表示挎狸,后面跟著一對花括號,括號里面是block的實現(xiàn)代碼

^{
   NSLog(@"myBlock");
 };

當有參數(shù)時

^(int value1, int value2){ 
  return value1 + value2琳猫;
};

函數(shù)塊語法:^ 返回值類型 參數(shù)列表 表達式

其中伟叛,無返回值時,返回值類型可以用void表示脐嫂,也可以省略不寫统刮;無參數(shù)時,可以用“()”占位账千,也可以省略不寫

2侥蒙,變量部分

函數(shù)塊部分實際上就是一個值,可以是相關數(shù)據(jù)類型(int匀奏、float等)鞭衩。可以將函數(shù)塊的值賦值給變量娃善,賦值后可以像函數(shù)那樣使用變量

   //變量聲明
    int (^addBlock)(int,int);
    
    //定義
    addBlock = ^(int a, int b){
       return a + b;
    };
    
    //調用
    addBlock(5,7);
    
    ------
    print: 12

addBlock 為block類型變量论衍,可以用來存儲函數(shù)塊

變量部分語法為: **返回值類型 (^變量名稱) (參數(shù)列表) **

二,block 與 typedef

利用 typedef 給 block 起別名聚磺,格式類似函數(shù)指針坯台,block變量的名稱就是別名

//格式:
typedef int (^AddBlock)(int,int);
j
AddBlock addblock = ^(int a, int b){
    return a + b;
};

三,block 與外部變量

1瘫寝,block可以訪問外部變量

int additional = 5;

int (^ addBlock)(int, int) = ^(int a, int b){
   return  a + b + additional;
};

int sum = addBlock(5,7);

----------
print: 17

從例子可以看出蜒蕾,block 可以訪問外部(在該block聲明范圍內,函數(shù)塊外部)變量

2焕阿,block 默認不能修改外部變量

block訪問外部變量的實質是將變量copy一份到堆內存咪啡,所以實質上函數(shù)塊內部訪問的變量與外部變量不是同一個,因此暮屡,默認情況下撤摸,block 不可以修改外部變量的值

因此,在block塊執(zhí)行后褒纲,再修改外部變量對塊內變量沒有任何影響

int additional = 5;

int (^ addBlock)(int, int) = ^(int a, int b){
   return  a + b + additional;
};

additional = 8;
int sum = addBlock(5,7);

----------
print: 17

3愁溜,__block修飾符
外部聲明變量時如果加__block修飾符,那么函數(shù)塊訪問外部變量實際上是地址傳遞外厂,這樣就可以修改外部變量了

__block int additional = 5;

int (^ addBlock)(int, int) = ^(int a, int b){
   additional = 10;
   return  a + b + additional;
};

int sum = addBlock(5,7);

四冕象,棧block與堆block

1,定義block的時候汁蝶,其所占的內存區(qū)域默認是分配在棧中的渐扮,也就是說block只在定義它的那個范圍內有效

void (^block)();
if( // 條件){
  block = ^{
    //代碼內容
  };
}else{
  block = ^{
      //代碼內容
    };
}
block();

上面代碼中block只在if、else語句中有效掖棉,離開這個范圍墓律,編譯器有可能把分配的內存覆蓋掉,因此block();調用幔亥,有可能會導致崩潰耻讽。
2,對block進行copy操作帕棉,block 會被轉移到堆內存中

void (^block)();
if( // 條件){
  block = ^{
    //代碼內容
  };
  [block copy];
}else{
  block = ^{
      //代碼內容
    };
  [block copy];
}
block();

3针肥,在棧內存:Block訪問外部對象饼记,不對對象進行retain操作

Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]);
        
 void (^myBlock)() = ^{
           NSLog(@"block retainCount = %lu",[p retainCount]);
 };
myBlock();

------------
print: 
retainCount = 1
block retainCount = 1

4,在堆內存中:Block訪問外部對象慰枕,會對對象進行retain操作

Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]);
        
 void (^myBlock)() = ^{
           NSLog(@"block retainCount = %lu",[p retainCount]);
 };
Block_copy(myBlock);
myBlock();

------------
print: 
retainCount = 1
block retainCount = 2

以上是目前總結的基礎知識點具则,后續(xù)我會逐漸深入,并更新內容具帮,也歡迎伙伴們指正和補充博肋。

參考書籍:
《Effective Objective 2.0》
《Objective-C 高級編程》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巡李,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病游,死亡現(xiàn)場離奇詭異,居然都是意外死亡术奖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門采记,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佣耐,“玉大人,你說我怎么就攤上這事唧龄〖孀” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵既棺,是天一觀的道長讽挟。 經(jīng)常有香客問我,道長丸冕,這世上最難降的妖魔是什么耽梅? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮胖烛,結果婚禮上眼姐,老公的妹妹穿的比我還像新娘。我一直安慰自己佩番,他們只是感情好众旗,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趟畏,像睡著了一般贡歧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天利朵,我揣著相機與錄音律想,去河邊找鬼。 笑死哗咆,一個胖子當著我的面吹牛蜘欲,可吹牛的內容都是我干的益眉。 我是一名探鬼主播晌柬,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼郭脂!你這毒婦竟也來了年碘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤展鸡,失蹤者是張志新(化名)和其女友劉穎屿衅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莹弊,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡涤久,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忍弛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响迂。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖细疚,靈堂內的尸體忽然破棺而出蔗彤,到底是詐尸還是另有隱情,我是刑警寧澤疯兼,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布然遏,位于F島的核電站,受9級特大地震影響吧彪,放射性物質發(fā)生泄漏待侵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一姨裸、第九天 我趴在偏房一處隱蔽的房頂上張望秧倾。 院中可真熱鬧,春花似錦啦扬、人聲如沸中狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胃榕。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勋又,已是汗流浹背苦掘。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楔壤,地道東北人鹤啡。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像蹲嚣,于是被迫代替她去往敵國和親递瑰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容

  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C語言的擴充功能——“帶有自動變量(即局部...
    SkyMing一C閱讀 2,347評論 6 18
  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)隙畜、block抖部、GCD,偏向于從原理上對這些內容...
    WeiHing閱讀 9,839評論 10 69
  • 1.OC的類可以多重繼承嗎议惰?可以實現(xiàn)多個接口嗎慎颗?要想實現(xiàn)類似多重繼承如何實現(xiàn)?答:OC不可以實現(xiàn)多重繼承言询「┪可以實現(xiàn)...
    歐辰_OSR閱讀 1,992評論 0 30
  • 在介紹Block之前通過一個簡單的應用場景認識下Block 場景描述如下:TableView上面有多個Custom...
    黑_白_灰閱讀 1,393評論 4 29
  • 轉自李峰峰博客 一、概述 閉包 = 一個函數(shù)「或指向函數(shù)的指針」+ 該函數(shù)執(zhí)行的外部的上下文變量「也就是自由變量」...
    Joshua520閱讀 992評論 0 0