iOS-block的演示

  1. 會如何定義一個block
  2. blcok變量的初始化
  3. 簡化block的定義
  4. 會在block內(nèi)部訪問與修改外部變量
  5. 會將block作為參數(shù)傳遞
  6. 知道block在哪

1.如何定義一個block?

1). block是1個數(shù)據(jù)類型,我們可以聲明block類型的變量. block類型的變量中專門來存儲1段代碼的.
    這段代碼可以返回值可以有參數(shù).

2). block類型的變量,雖然是用來存儲1段代碼的.
    但是,1個block變量中并不是任意的1段代碼都可以存儲的.
    而是有限定的.
    
    在聲明1個block類型的變量的時候 必須要指定這個block變量中可以存儲的代碼的參數(shù)和返回值描述.
    一旦指定,這個block變量中只能存儲這樣的代碼段.別的格式的代碼段是無法存儲進(jìn)去的.

3). 如何去聲明block類型的變量.
    
    a. 根據(jù)剛剛的解釋,聲明block變量的時候,要指定這個這個block變量中存儲的代碼段的返回值和參數(shù).

    b. 聲明block變量的語法:

       返回值類型 (^block變量名稱)(參數(shù)列表);

       void (^myBlock)(); 
       代表聲明了1個block類型的變量,變量名加做myBlock.
       這個變量中只能存儲沒有返回值,也沒有參數(shù)的1段代碼.


       int (^myBlock)();
       代表聲明了1個block類型的變量,變量名加做myBlock.
       這個變量中只能存儲返回值為int類型的,沒有參數(shù)的1段代碼.

       int (^myBlock)(int num1,int num2);
       代表聲明了1個block類型的變量,變量名加做myBlock.
       這個變量中只能存儲返回值為int類型的,并且有兩個整型的參數(shù)的1段代碼.

    c. 特別注意:

       1個block變量中只能存儲和這個block變量要求相同的1短代碼.

2.block變量的初始化

1). 初始化block變量的原理: 寫1段符合block變量要求的代碼,把這段代碼存儲到這個block變量中.


2). 書寫1個block代碼段的語法格式.

    ^返回值類型(參數(shù)列表){
        代碼;
    };


3). 無參數(shù)無返回值的代碼段.

    ^void(){
        NSLog(@"我愛你");
        NSLog(@"打瞌睡的小女孩");
    };

    這個時候,就可以將這段代碼 通過賦值符號. 賦值給無參數(shù),無返回值的block變量.

     void (^myBlock1)();
     myBlock1 =  ^void(){
        NSLog(@"我愛你");
        NSLog(@"打瞌睡的小女孩");
     };

     代表的意義:myBlock1變量中存儲了這段代碼;


4). 有返回值無參數(shù)的代碼段. 
    注意: 如果代碼段標(biāo)識了有返回值,那么在代碼段結(jié)束之前,必須要使用return返回1個數(shù)據(jù).

    ^int(){
       int num1 = 10;
       int num2 = 20;
       int num3 = num1 + num2;
       return num3;
    };


5). 有返回值有參數(shù)的代碼段.

    ^int(int num1,int num2){
        int num3 = num1 + num2;
        return num3;
    };


6). 特別強調(diào): block變量中只能存儲和這個block變量要求相同的代碼段.否則就會報語法錯誤.

3.簡化block的定義

1). 感覺到隱隱不爽的地方: 聲明1個block變量代碼太長了.

2). 將長的block變量定義變得短一些.

3). typedef: 為1個已經(jīng)存在的數(shù)據(jù)類型取1個別名.     
    當(dāng)1個數(shù)據(jù)類型太長的時候,我們就可以使用typedef給它定義1個短別名,這樣方便.

4). typedef也可以將1個長的block類型定義為1個短類型.

    語法格式: typedef 返回值類型 (^新類型名稱)(參數(shù)列表);
    
    typedef void (^NewType)();
    代表新定義了1個類型 這個類型的名字叫做NewType.
    這是1個無參數(shù)無返回值的block類型.

    如果我們要定義1個無參數(shù)無返回值的block變量.直接使用NewType就可以定義了.


    typedef int (^NewType)(int num1,int num2);
    代表新定義了1個數(shù)據(jù)類型.  這個類型的名字叫做NewType.
    這是1個返回值為int 有兩個整型參數(shù)的block類型.  
    如果我們要定義1個返回值為int 有兩個整型參數(shù)的block類型變量. 直接使用這個新類型就可以定義.

4. 會在block內(nèi)部訪問與修改外部變量

1). 在block代碼塊的內(nèi)部可以定義1個和外部的變量名稱相同的變量.
    訪問的時候,是就近原則.


2). 在block代碼塊的內(nèi)部可以去取出外部的全局變量和局部變量的值.
    但是,在block代碼塊的內(nèi)部,可以修改全局變量的值,但是不能修改外部的局部變量的值.


3). 如果就是希望在block代碼塊的內(nèi)部去修改外部的局部變量的值.
    那么就給這個局部變量加個__block的修飾符.


4). block修改外部變量
    // 類型  變量名 = 值;
    __block int age = 100;
    NSLog(@"====%p",&age); // 棧
    // 使用__block修飾外部變量時, 在定義完成block之后,棧中的外部變量就是一個擺設(shè),沒有什么卵用了
    void (^block)() = ^{
        age = 200;
        NSLog(@"block中的age = %d",age); // 200
        NSLog(@"我是block = %p",&age); // 堆
    };
    NSLog(@"====%p",&age); // 棧
    NSLog(@"age = %d",age); // 100
    // 執(zhí)行block
    block();
    NSLog(@"====%p",&age); // 堆
    NSLog(@"age = %d",age); // 200

5.將block作為參數(shù)傳遞

1). block是1個數(shù)據(jù)類型.
    那么block就必須可以作為方法/函數(shù)的參數(shù).


2). 如何為函數(shù)寫1個block類型的參數(shù).

    1> 只需要在函數(shù)的小括弧中寫聲明1個block類型的變量就可以.

        void test(void (^block1)());
        代表,這個函數(shù)有1個block參數(shù).無返回值無參數(shù)的block參數(shù).


    2> 如果你覺得暈.
        那么就可以使用typedef將block類型定義的短1些.

        typedef void (^NewType)();
        void test(NewType b1)


3). 如何調(diào)用帶block參數(shù)的函數(shù).

    1> 如果調(diào)用的函數(shù)的參數(shù)是1個block類型的.
        那么要求傳遞1個和形參block類型相同的block變量

        可以先將符合要求的代碼存儲在1個block變量中,然后傳遞這個變量.


    2> 可以直接傳遞符合要求的代碼段.


         test( ^{
             NSLog(@"啦啦啦啦啦,我是打瞌睡的小行家");
             NSLog(@"不等天明打瞌睡");
             NSLog(@"太陽出來還在打!");
         });


4. 把block作為函數(shù)的參數(shù)能夠?qū)崿F(xiàn)什么效果?

    之前的函數(shù)的參數(shù)能做什么事情: 可以將調(diào)用者的數(shù)據(jù)傳遞到函數(shù)的內(nèi)部去使用.
    block作為參數(shù): 可以將調(diào)用者的1段代碼傳遞到函數(shù)的內(nèi)部去執(zhí)行.



5. 什么時候需要將block作為參數(shù)?

    1個函數(shù)代表1個相對對獨立的功能.
    函數(shù)在完成這個功能的時候,發(fā)現(xiàn)需要執(zhí)行1段代碼才可以繼續(xù)完成.
    而這段代碼函數(shù)內(nèi)部不確定是什么樣的代碼
    只有調(diào)用者確定.
    那么這個時候,就可以將block作為函數(shù)的參數(shù).
    讓調(diào)用者在調(diào)用這個函數(shù)的時候 把這段代碼傳遞進(jìn)來.
    放在這里執(zhí)行.

6.知道block在哪

block有三種類型:
    1> 全局block:
    - 不管是ARC還是MRC,block內(nèi)部沒有訪問任何外部變量或訪問的外部變量是靜態(tài)變量時,block就是全局block

    2> 堆block:
    - 在MRC下,給block調(diào)用copy方法,會將棧block拷貝到堆中.
    - 在MRC環(huán)境下,如果block是堆區(qū)block,需要程序猿手動release

    3> 棧block:
    - 在MRC環(huán)境下,block內(nèi)部訪問了外部變量時且不是靜態(tài)變量,block就是棧block

最后分享一個關(guān)于block是如何實現(xiàn)的技術(shù)博客:談Objective-C block的實現(xiàn)-唐巧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖烟勋,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡末早,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門说庭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來然磷,“玉大人,你說我怎么就攤上這事刊驴∽怂眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵捆憎,是天一觀的道長舅柜。 經(jīng)常有香客問我,道長攻礼,這世上最難降的妖魔是什么业踢? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮礁扮,結(jié)果婚禮上知举,老公的妹妹穿的比我還像新娘。我一直安慰自己太伊,他們只是感情好雇锡,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著僚焦,像睡著了一般锰提。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天立肘,我揣著相機與錄音边坤,去河邊找鬼。 笑死谅年,一個胖子當(dāng)著我的面吹牛茧痒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播融蹂,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旺订,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了超燃?” 一聲冷哼從身側(cè)響起区拳,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎意乓,沒想到半個月后樱调,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡洽瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年本涕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伙窃。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡菩颖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出为障,到底是詐尸還是另有隱情晦闰,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布鳍怨,位于F島的核電站呻右,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鞋喇。R本人自食惡果不足惜声滥,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侦香。 院中可真熱鬧落塑,春花似錦、人聲如沸罐韩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽散吵。三九已至龙考,卻和暖如春蟆肆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晦款。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工炎功, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬赐。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓亡问,卻偏偏與公主長得像官紫,于是被迫代替她去往敵國和親肛宋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)束世、block酝陈、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 9,810評論 10 69
  • 在介紹Block之前通過一個簡單的應(yīng)用場景認(rèn)識下Block 場景描述如下:TableView上面有多個Custom...
    黑_白_灰閱讀 1,388評論 4 29
  • 1.1 局部變量 局部自動變量毁涉,在Block中可被讀取沉帮。Block定義時copy變量的值,在Block中作為常量使...
    陳雨塵閱讀 2,932評論 4 31
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理贫堰,服務(wù)發(fā)現(xiàn)穆壕,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 嗟余悲咽其屏,淚注千行喇勋;一曲昉然,萬馬哽宕偎行。余琴瑟師旅川背,鄉(xiāng)情倍蓰,乃臨觀歌蛤袒,歌起思齊: 繩繩宗祠熄云,浩浩祊堂。 踆烏躔次...
    季夢VC_ETG閱讀 392評論 3 5