iOS中block的使用

一贩虾、block簡介

block代碼塊是在iOS4開始引入的對C語言的擴(kuò)展催烘,用來實(shí)現(xiàn)匿名函數(shù)的特性,block是一種特殊的數(shù)據(jù)類型缎罢,其可以正常定義變量伊群、作為參數(shù)、作為返回值策精,blcok還可以保存一段代碼舰始,在需要時調(diào)用。

二蛮寂、block定義

block在定義時并不會執(zhí)行內(nèi)部的代碼蔽午,只有在調(diào)用時才會執(zhí)行。

//block變量的賦值:Block變量 = ^(參數(shù)列表){函數(shù)體};

1酬蹋、無參數(shù)無返回值的block

//1及老、無參數(shù)無返回值的block
    //zqqBlock是block名 無參數(shù)可省略參數(shù)列表()
    //void (^zqqBlock)() = ^{};
    void (^zqqBlock)() = ^(){
        NSLog(@"這是無返回值無參數(shù)的block");
    };
    //調(diào)用
    zqqBlock();

2抽莱、有參數(shù)無返回值的block

    //zqqBlock是block名 NSString 是參數(shù)類型,x,y參數(shù)
    void (^zqqBlock)(NSString* ,NSString*) = ^(NSString *x,NSString *y){
        NSLog(@"這是無返回值有參數(shù)的block骄恶,參數(shù)是%@,%@",x,y);
    };
    //調(diào)用
    zqqBlock(@"a",@"b");

3食铐、有參數(shù)有返回值的block

    //NSString是返回類型 zqqBlock是block名 NSString 是參數(shù)類型,x,y參數(shù)
    NSString* (^zqqBlock)(NSString* ,NSString*) = ^(NSString *x,NSString *y){
        return [NSString stringWithFormat:@"%@+%@",x,y];
    };
    //調(diào)用
    NSString *testStr = zqqBlock(@"a",@"b");
    NSLog(@"%@",testStr);

三僧鲁、block使用

1虐呻、block重命名

利用typedef為block進(jìn)行重命名

#import "ViewController.h"
@interface ViewController ()
//定義一個無返回值無參數(shù)的block
typedef void (^zqqBlock)();
//用自定義的zqqBlock聲明一個block
@property (nonatomic, copy) zqqBlock abock;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 避免循環(huán)引用,用__weak修飾
    __weak ViewController *weakSelf = self;
    self.abock = ^{
        weakSelf.view.backgroundColor = [UIColor redColor];
    };
    //調(diào)用
    self.abock();
}
@end

2寞秃、block的應(yīng)用場景

block聲明屬性要用copy修飾
因?yàn)橹挥衏opy后的Block才會在堆中斟叼,棧中的Block的生命周期是和棧綁定的
<棧 :由系統(tǒng)維護(hù)的局部變量 是存在棧上的,其生命周期隨函數(shù)的生命周期>
<堆 :由程序員申請空間地址春寿,由程序員手動釋放朗涩,生命周期受到程序員控制>
使用retain也可以,因?yàn)閎lock的retain行為默認(rèn)是用copy的行為實(shí)現(xiàn)的绑改,block變量默認(rèn)是聲明為棧變量的谢床,為了能夠在block的聲明域外使用,所以要把block拷貝(copy)到堆厘线,所以說為了block屬性聲明和實(shí)際的操作一致识腿,最好聲明為copy。

block的使用:
  • 反向傳值
//1.在NextViewController.h中聲明block
#import <UIKit/UIKit.h>
typedef void (^popToNextBlock)(UIColor *color);//1.別名 傳參
@interface NextViewController : UIViewController
@property (nonatomic, strong) popToNextBlock popToNextBlock;//2.聲明block
@end
//2.在NextViewController.m中定義block
#import "NextViewController.h"
-(void)popToFirstBtnClick:(id)sender{
    [self.navigationController popViewControllerAnimated:YES];
    if (self.popToNextBlock){
        UIColor *color = [UIColor redColor];
        self.popToNextBlock(color);
    }
}
//上一控制器push時調(diào)用
    NextViewController *nextVc = [[NextViewController alloc]init];
    [self.navigationController pushViewController:nextVc animated:YES];
    //調(diào)用block
    __weak ViewController *weakSelf = self;
 //block的回調(diào)只對最后一次賦值有效
    nextVc.popToNextBlock = ^(UIColor *color){
        //避免循環(huán)引用造壮,應(yīng)該使用弱引用
          weakSelf.view.backgroundColor = color;
    };
  • 在方法中定義block 回調(diào)傳值
//1.ZqqTool.h文件
#import <Foundation/Foundation.h>
typedef void(^ZqqToolBlock)(NSString *string);
@interface ZqqTool : NSObject
//在方法中封裝block
-(void)zqqToolWithString:(NSString *)str andBlock:(ZqqToolBlock)block;
//2.ZqqTool.m文件
#import "ZqqTool.h"
-(void)zqqToolWithString:(NSString *)str andBlock:(ZqqToolBlock)block{
    block(str);
}
@end
//3.調(diào)用
    ZqqTool *tool = [[ZqqTool alloc]init];
    [tool zqqToolWithString:@"測試" andBlock:^(NSString *string) {
        NSLog(@"%@",string);
    }];
  • 作為參數(shù)傳遞
//1.ZqqSendBlock ZqqTool.h文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef void(^ZqqSendBlock)(UIColor *color);
typedef void(^ZqqToolBlock)(NSString *string);
@interface ZqqTool : NSObject
//在方法中封裝block
-(void)zqqToolWithString:(NSString *)str andBlock:(ZqqToolBlock)block;
-(void)ZqqSendBlock:(ZqqSendBlock)block;
@end
//2..ZqqTool.m文件
#import "ZqqTool.h"
@implementation ZqqTool
-(void)zqqToolWithString:(NSString *)str andBlock:(ZqqToolBlock)block{
    block(str);
}
-(void)ZqqSendBlock:(ZqqSendBlock)block{
    block([UIColor redColor]);
}
@end
//3.調(diào)用
ZqqTool *tool = [[ZqqTool alloc]init];
    [tool zqqToolWithString:@"測試" andBlock:^(NSString *string) {
        NSLog(@"%@",string);
    }];
    [tool ZqqSendBlock:^(UIColor *color) {
        //
        self.view.backgroundColor = color;
    }];
注意:1渡讼、block中使用局部變量

局部變量在block中只讀。變量的值在Block外改變费薄,也不影響他在Block中的值硝全。局部變量加__block修飾可在block代碼塊內(nèi)被修改拐叉。

注意:2砸讳、block中循環(huán)引用問題

block用copy修飾家厌,在self持有block中調(diào)用self或調(diào)用屬于self的都會出現(xiàn)循環(huán)引用蹄咖!解決方法:__weak Class *weakSelf = self;
而block本身不被self持有扼劈,就不會出現(xiàn)循環(huán)引用了弹惦。例如:UIView的動畫block

[UIView animationWithDuration:0.2 animation:^{
     //
}];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揍堕,一起剝皮案震驚了整個濱河市悟耘,隨后出現(xiàn)的幾起案子竞慢,更是在濱河造成了極大的恐慌先紫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹煮,死亡現(xiàn)場離奇詭異遮精,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門本冲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來准脂,“玉大人,你說我怎么就攤上這事檬洞±旮啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵添怔,是天一觀的道長湾戳。 經(jīng)常有香客問我,道長广料,這世上最難降的妖魔是什么砾脑? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮艾杏,結(jié)果婚禮上拦止,老公的妹妹穿的比我還像新娘。我一直安慰自己糜颠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布萧求。 她就那樣靜靜地躺著其兴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夸政。 梳的紋絲不亂的頭發(fā)上元旬,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音守问,去河邊找鬼匀归。 笑死,一個胖子當(dāng)著我的面吹牛耗帕,可吹牛的內(nèi)容都是我干的穆端。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仿便,長吁一口氣:“原來是場噩夢啊……” “哼体啰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗽仪,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤荒勇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闻坚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沽翔,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年窿凤,在試婚紗的時候發(fā)現(xiàn)自己被綠了仅偎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跨蟹。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哨颂,靈堂內(nèi)的尸體忽然破棺而出喷市,到底是詐尸還是另有隱情,我是刑警寧澤威恼,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布品姓,位于F島的核電站,受9級特大地震影響箫措,放射性物質(zhì)發(fā)生泄漏腹备。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一斤蔓、第九天 我趴在偏房一處隱蔽的房頂上張望植酥。 院中可真熱鬧,春花似錦弦牡、人聲如沸友驮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卸留。三九已至,卻和暖如春椭豫,著一層夾襖步出監(jiān)牢的瞬間耻瑟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工赏酥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喳整,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓裸扶,卻偏偏與公主長得像框都,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姓言,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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