block大全

  • Block類型是一個C級別的語法和運行機制。


    block圖.png

    實例:

//定義有返回值和參數的block
int (^sumBlock2)(int x, int y) = ^ int (int a, int b) {
        return a + b;
 };
//調用有返回值的block 
NSLog(@"%d", sumBlock2(4, 8));
  • typedef使用
//給無參無返回值block變量起別名; 
//格式: void (^新類型名)(); 
typedef void (^newType)();
//用新的類型定義block變量 newType t1;
t1 = ^{ 
      NSLog(@"我是使用newType定義出來的變量t1的值");
};
//調用block 
t1();

有參數有返回值的block起別名

//給有參數有返回值的block起別名
        typedef int(^blockType2)(int ,int );
        blockType2 b2 = ^(int x,int y){
            return x>y?x:y;
        };
        //max保存的是代碼塊執行的結果
        int max = b2(119,45);
  • 函數指針
 //調用函數
        int s =  sum(10, 119);  //函數名存放的是函數的首地址
        //定義函數指針
        int (*p)(int a,int b);  //p 函數指針變量
        typedef int (*p1)(int a,int b);   //給返回值是int 并且有兩個參數的函數指針起一個別名  別名是p1 (是一個類型)
        p = sum;
        p1 = a
        s = (*p)(10,119);
        NSLog(@"s = %d",s);
訪問外部變量
  1. 注意在block代碼塊的內部使用外部變量的時候注意
    1)在block定義的時候,把block外部的變量的值copy到了內存的堆區
    2)拷貝的過程中使用了const(以const的形式把外部變量做了一個copy)--要想修改值使用__block
  2. 注意:一旦把使用__block修飾某個變量,注意block之后,使用的都是 堆區的變量
  3. __block 修飾符 告訴編譯器,i的值可以在block內部修改(忽略檢查)
block作為函數參數
//通過函數,傳遞一個參數,
void test(void (^myblock)()){
    if (myblock) {
        //調用block
        myblock();
    }
}
//兩種方式實現
//定義一個代碼塊,打印
        void (^b1)()=^{
            NSLog(@"**********");
            NSLog(@"**********");
            NSLog(@"哈哈哈");
        };
        //調用
        test(b1);
        test(^{
            NSLog(@"wwwwwwww");
        });

block作為方法的返回值
//聲明
typedef void(^blockType)();
-(blockType)test2;
//實現
-(blockType)test2{
    return ^{
        NSLog(@"test2 return block");
    };
}
//調用
//返回值是block類型的方法
       blockType b1  = [p test2];
       b1();

三種類型的block

根據Block在內存中的位置分為三種類型NSGlobalBlock,NSStackBlock, NSMallocBlock。 NSGlobalBlock:類似函數,位于代碼段; NSStackBlock:位于棧內存,函數返回后Block將無效; NSMallocBlock:位于堆內存。

  • 全局block (NSGlobalBlock),定義在函數外面的block是global的。
    如果函數內部的 block,但是沒有捕獲任何自動變量,那么它也是全局的(ARC和MRC都一樣)。
  • 棧block
  • 堆block 則是對棧block copy 得來。對全局block copy 不會有任何作用,返回的依然是全局block。

block類型變量內存管理參數為什么要使用 copy

1.不管在MRC還是在ARC,使用assign 修飾的block,都是棧block,棧block會被提前釋放。
2.在ARC下 block類型的變量 strong 相當于 copy。但是我們不會直接寫成strong 而是寫成 copy

block的內存隱患

Block_copy(bb);   //copy block到堆區(bb位于堆區了)
Block_release(bb);  //釋放b1的空間(b1已經是一個堆block)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容