Block

Block概念介紹

block是一段代碼塊,是一個(gè)對(duì)象

Block的聲明

返回值(^block變量名)(參數(shù))
    void(^block)();

Block的定義

    // block定義:三種方式 = ^(參數(shù)){};
    // 第一種
    void(^block1)() = ^{
        NSLog(@"調(diào)用了block1");
    };
    
    // 第二種 如果沒有參數(shù),參數(shù)可以隱藏,如果有參數(shù),定義的時(shí)候,必須要寫參數(shù),而且必須要有參數(shù)變量名
    void(^block2)(int) = ^(int a){
        
    };
    
    // 第三種 block返回可以省略,不管有沒有返回值,都可以省略
    int(^block3)() = ^int{
        return 3;
    };
    
    // block類型:int(^)(NSString *)
    int(^block4)(NSString *) = ^(NSString *name){
        return 2;
    };
    
    // block調(diào)用
    block1();

Block的快捷定義:

 block快捷方式 inline 
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
        <#statements#>
    };

Block開發(fā)使用

BlockType:類型別名
typedef void(^BlockType)();

block怎么聲明,就如何定義成屬性
@property (nonatomic, strong) void(^block)();
@property (nonatomic, strong) BlockType block1;

Block的傳值:順傳草穆,逆?zhèn)?/p>

Block的內(nèi)存管理

  1. 切換MRC與ARC環(huán)境


    E6C65D26-9806-4D2A-BFFD-C4A8178E446C.png
  2. 如何判斷當(dāng)前環(huán)境是MRC還是ARC只壳?

    • dealloc 能否調(diào)用super,只有MRC才能調(diào)用super
    • 能否使用retain,release.如果能用就是MRC
  3. 無(wú)論MRC還是ARC

    只要block沒有引用外部局部變量,block放在全局區(qū)
    

MRC下的Block應(yīng)用

  1. MRC了解開發(fā)常識(shí)

    • MRC沒有strong``weak,局部變量對(duì)象就是相當(dāng)于基本數(shù)據(jù)類型
    • MRC給成員屬性賦值,一定要使用set方法,不能直接訪問下劃線成員屬性賦值
  2. MRC:管理block

    • 總結(jié):只要block沒有引用外部局部變量,block放在全局區(qū)NSGlobalBlock
    void(^block)() = ^ {
        NSLog(@"在全局區(qū)");
    };
    block();
    NSLog(@"%@", block);
    
    • 只要Block引用外部局部變量,block放在棧里面NSStackBlock
    int d = 90;
    void(^block)() = ^ {
        NSLog(@"在棧區(qū)%d", d); // 引用了外部局部變量
    };
    block();
    NSLog(@"%@", block);
    
    • block只能使用copy,不能使用retain,使用retain,block還是在棧里面
    5E5910AD-4C03-47A4-91D1-DB65468AF5F4.png
    421EEE13-8D8D-41AE-BF6F-ADC6455E26ED.png
    AFD77458-7CA2-4819-8674-2D69F066F1EC.png

ARC下的Block應(yīng)用

  1. ARC管理原則

    • 只要一個(gè)對(duì)象沒有被強(qiáng)指針修飾就會(huì)被銷毀,默認(rèn)局部變量對(duì)象都是強(qiáng)指針,存放到堆里面
  2. 只要block引用外部局部變量,block放在堆里面

  3. block使用strong.最好不要使用copy

  4. __block的應(yīng)用

    0CFC6848-8669-407E-81E4-0C5E2DFC20B4.png
    4BBDECA7-78B5-45E5-BCF8-B0F162FD6B0B.png
    4C3A28D5-3E5F-4F63-B535-57528D359C6C.png
E85D2796-5DF3-4A43-9370-911CED719DC7.png

循環(huán)引用

  1. 循環(huán)引用:我引用你,你也引用,就會(huì)造成循環(huán)引用,雙方都不會(huì)被銷毀,導(dǎo)致內(nèi)存泄露問題
  2. block造成循環(huán)利用:Block會(huì)對(duì)里面所有強(qiáng)指針變量都強(qiáng)引用一次
_block = ^{
  NSLog(@"%@",self); //造成循環(huán)引用
}
 _block();
__weak typeof(self) weakSelf = self;
    
_block = ^{
     NSLog(@"%@",weakSelf); //沒有循環(huán)引用
};
_block();
__weak typeof(self) weakSelf = self;
    
_block = ^{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             NSLog(@"%@",weakSelf); // 如果在2s內(nèi)dismissViewController(想要銷毀vc),則此處打印為nil
        });
};

_block();
__weak typeof(self) weakSelf = self;
    
_block = ^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
        
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
         NSLog(@"%@",strongSelf);// 所以在block內(nèi)再strongSelf此處打印為當(dāng)前vc洪燥,當(dāng)前vc會(huì)在執(zhí)行完當(dāng)前block之后再銷毀阻塑,也就是dismiss時(shí)vc不銷毀歉眷,10s后執(zhí)行了代碼后vc會(huì)自動(dòng)銷毀
            
    });
        
};
    
_block();

變量傳遞

  1. 如果是局部變量,Block是值傳遞
  2. 如果是靜態(tài)變量,全局變量,__block修飾的變量,block都是指針傳遞
__weak __typeof(self)weakSelf = self;
static int a = 3;                   //靜態(tài)變量
self.b = 2;                         //全局變量
int c = 3;                          //局部變量,值傳遞
__block int d = 5;                  //__block修飾
NSString *name = @"name";           //局部變量
__block NSString *text = @"text";   //__block修飾
void (^testBlock)() = ^ {
    NSLog(@"a = %d, b = %d, c = %d, d = %d, name = %@, 
      text = %@", a, weakSelf.b, c, d,name, text);
    };
a = 10;
self.b = 10;
c = 10;
d = 10;
name = @"hello";
text = @"world";
testBlock();

結(jié)果:
a = 10, b = 10, c = 3, d = 10, name = name, text = world

Block作為參數(shù)

CalculatorManager *mgr = [[CalculatorManager alloc] init];
[mgr plus:^NSInteger(NSInteger result) {
    return result + 3;
}];

// CalculatorManager
- (void)plus:(NSInteger (^)(NSInteger value))addBlock {
    if (addBlock) {
        _resulte = addBlock(_resulte);
    }
}

鏈?zhǔn)骄幊?/h3>
CalculatorManager *mgr = [[CalculatorManager alloc] init];

//mgr.div (3),mgr.div返回block材诽,block的參數(shù)是3
mgr.div(3).div(1).div(2); 

//返回Block
- (CalculatorManager * (^)(NSInteger value))div{
    return ^(NSInteger value){  // 返回值為block
        _resulte = _resulte / value;
        return self;            //block的返回類型為CalculatorManager
    };
}

其他

  1. Block在MRC中就是基本數(shù)據(jù)類型
  2. ARC的局部變量默認(rèn)都是強(qiáng)指針
  3. 為什么ARC中局部變量默認(rèn)是強(qiáng)指針底挫?為了在代碼塊中不被銷毀,
  4. Block用weak什么時(shí)候銷毀
  5. Block在ARC中用Strong
  6. manager item
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脸侥,一起剝皮案震驚了整個(gè)濱河市建邓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睁枕,老刑警劉巖官边,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異外遇,居然都是意外死亡注簿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門跳仿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)滩援,“玉大人,你說(shuō)我怎么就攤上這事塔嬉⊥婊玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谨究,是天一觀的道長(zhǎng)恩袱。 經(jīng)常有香客問我,道長(zhǎng)胶哲,這世上最難降的妖魔是什么畔塔? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上澈吨,老公的妹妹穿的比我還像新娘把敢。我一直安慰自己,他們只是感情好谅辣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布修赞。 她就那樣靜靜地躺著,像睡著了一般桑阶。 火紅的嫁衣襯著肌膚如雪柏副。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天蚣录,我揣著相機(jī)與錄音割择,去河邊找鬼。 笑死萎河,一個(gè)胖子當(dāng)著我的面吹牛荔泳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虐杯,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玛歌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了厦幅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤慨飘,失蹤者是張志新(化名)和其女友劉穎确憨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓤的,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡休弃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圈膏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔猾。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稽坤,靈堂內(nèi)的尸體忽然破棺而出丈甸,到底是詐尸還是另有隱情,我是刑警寧澤尿褪,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布睦擂,位于F島的核電站,受9級(jí)特大地震影響杖玲,放射性物質(zhì)發(fā)生泄漏顿仇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臼闻。 院中可真熱鬧鸿吆,春花似錦、人聲如沸述呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)市埋。三九已至黎泣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缤谎,已是汗流浹背抒倚。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坷澡,地道東北人托呕。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像频敛,于是被迫代替她去往敵國(guó)和親项郊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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