內(nèi)存管理篇之Blocks

內(nèi)存管理篇之Blocks

Blocks 是 C 語言的擴充功能:帶有自動變量(局部變量)的匿名函數(shù)

1. Block 類型變量

聲明如下:

int (^block)(int);

block 實現(xiàn)賦值

    int(^block)(int)  = ^(int num) {
        NSLog(@"%d",num);
        return num + 10;
    };
    
    block(222);

可以按照如下格式定義一個類型:typedef returnType(^blockName)(parameterType) ;

2. Block 作為函數(shù)參數(shù)

格式1:- type funckName:(returnType(^)(parameterType)) blockName{}

//定義類型
typedef  void(^myblock)(int) ;

//聲明屬性--可以直接把 block 名當(dāng)做一個類型使用
@property (nonatomic, copy) myblock block;
//block 作為函數(shù)參數(shù)方式一
-(void)blockTest:(void(^) (int))  func{
    func(2);
}
//block 作為函數(shù)參數(shù)方式二
-(void)blockTest2:(myblock )  func{
    func(2);
}

3. Block 截獲局部變量值

block 截獲的是 自動變量的瞬間值.也就是說在 block 定義之后改變了 自動變量值,也不會影響 block 執(zhí)行時候的值了

    NSString* str = @"test";
    
    void (^pBlock)(void)  = ^{
         NSLog(@"str = %@",str);
    };
    str = @"test2";
    pBlock();

打印結(jié)果: str = test

4. __block說明符

block 因為截獲的只是 變量的瞬間值,因此是不能修改的.如果嘗試修改會報編譯錯誤. 如果想在 block 中修改外部變量的值,需要在外部使用__ block 說明符.

這個會報編譯錯誤:

    NSString* str = @"test";
    
    void (^pBlock)(void)  = ^{
         NSLog(@"str = %@",str);
        str = @"change test";
    };

下面的正常:

    __block NSString* str = @"test";
    
    void (^pBlock)(void)  = ^{
         NSLog(@"str = %@",str);
        str = @"change test";
    };

5. 截獲自動變量

如果 向 block 中截獲的自動變量賦值,就會產(chǎn)生編譯錯誤,基本數(shù)據(jù)類型和 OC 類型都一樣,但是調(diào)用 OC 對象的方法不會產(chǎn)生編譯錯誤

下面的代碼運行正常:

    NSMutableArray *arr = [NSMutableArray array];
    
    void (^pBlock)(void)  = ^{
        
        [arr addObject:@"test"];
    };

    pBlock();

下面的代碼嘗試給 arr賦值,編譯異常:

    NSMutableArray *arr = [NSMutableArray array];
//    __block NSMutableArray *arr = [NSMutableArray array]; //這樣會沒有異常

    void (^pBlock)(void)  = ^{
        
         arr = [NSMutableArray array];
    };

    pBlock();

6. 允許 block 改寫截獲的自動變量的幾種情況

  • __block說明符修飾
  • 靜態(tài)變量
  • 靜態(tài)全局變量
  • 全局變量

如下面幾個例子

int globleParam = 1; //1>全局變量
static int sGlobleParam = 2; //2>靜態(tài)全局變量

int main(int argc, char * argv[]) {

    static int index = 3; //3>靜態(tài)局部變量
//    __block int index = 4; //4>__block 說明符
    void (^pBlock)(void)  = ^{
       globleParam *= 2;
        sGlobleParam *= 2;
        index = 2;
    };

    pBlock();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(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
  • 正文 為了忘掉前任檐蚜,我火速辦了婚禮魄懂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闯第。我一直安慰自己逢渔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布乡括。 她就那樣靜靜地躺著肃廓,像睡著了一般智厌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盲赊,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天铣鹏,我揣著相機與錄音,去河邊找鬼哀蘑。 笑死诚卸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绘迁。 我是一名探鬼主播合溺,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缀台!你這毒婦竟也來了棠赛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤膛腐,失蹤者是張志新(化名)和其女友劉穎睛约,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哲身,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡辩涝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了勘天。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔揩。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脯丝,靈堂內(nèi)的尸體忽然破棺而出商膊,到底是詐尸還是另有隱情,我是刑警寧澤巾钉,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布翘狱,位于F島的核電站,受9級特大地震影響砰苍,放射性物質(zhì)發(fā)生泄漏潦匈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一赚导、第九天 我趴在偏房一處隱蔽的房頂上張望茬缩。 院中可真熱鬧,春花似錦吼旧、人聲如沸凰锡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掂为。三九已至裕膀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勇哗,已是汗流浹背昼扛。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欲诺,地道東北人抄谐。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像扰法,于是被迫代替她去往敵國和親蛹含。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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

  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C語言的擴充功能——“帶有自動變量(即局部...
    SkyMing一C閱讀 2,347評論 6 18
  • 全乎的Blocks講解 一句話概括Blocks: 帶有自動變量(局部變量)的匿名函數(shù) Blocks模式 Block...
    凌巔閱讀 670評論 0 0
  • 一. Blocks的認識 什么是Blocks? Blocks是C語言的拓展功能(帶有局部變量的匿名函數(shù))塞颁。局部變量...
    WellsCai閱讀 249評論 0 2
  • 在前兩篇中浦箱,我們介紹了一些關(guān)于C語言的重要概念,指針跟struct殴边,這些基礎(chǔ)知識是我們深入學(xué)習(xí)block的前提憎茂,在...
    ccSundayChina閱讀 528評論 2 3
  • 時間管理名人堂 — 28 紫子梔 入選時間:2016年2月19日 入選級別:季級 入選理由:紫子梔珍语,女锤岸,90后大學(xué)...
    V5特湘葉葉閱讀 233評論 0 0