blcok使用小记

前言

不要失去信心,只要坚持不懈,就终会有成果的。——钱学森

虽然block经常在使用,但是没正正经经整理梳理下用法,下面只是个人学习路上的记录,仅供参考。有问题还望指正。

block的声明

 Block变量的声明格式为: 返回值类型(^Block名字)(参数列表);

 //无返回值block
 void(^aBlock)(NSString *x, NSString *y);

 //形参变量可以省略,保留参数类型即可
 void(^aBlock)(NSString *, NSString *);

 //typedef类型定义
 typedef void(^RLBlock)(NSString *str);

block的赋值

//赋值
aBlock = ^ (NSString *str1 ,NSString *str2){
    NSLog(@"%@ %@",str1,str2);
};

//声明的同时进行赋值  申明 + 赋值
int(^myBlock)(int) = ^(int num){
    return num * 7;
};

//如果没有参数列表,在赋值时参数列表可以省略  申明 + 赋值
void(^aVoidBlock)(void) = ^{
    NSLog(@"I am a aVoidBlock");
};

block的调用

aBlock(@"Do You Like This?" ,@"YES,I Do!");

NSLog(@"计算结果 : %d",myBlock(6));

//如果没有参数列表,在赋值时参数列表可以省略  申明 + 赋值
void(^aVoidBlock)(void) = ^{
    NSLog(@"I am a aVoidBlock");
};
//调用
aVoidBlock();

/**
 在实际使用Block的过程中,我们可能需要重复地声明多个相同返回值相同参数列表的Block变量,
 如果总是重复地编写一长串代码来声明变量会非常繁琐,所以我们可以使用typedef来定义Block类型
 */

 //声明
typedef void(^RLBlock)(NSString *str);
//赋值
RLBlock rlblock = ^(NSString *str){
    NSLog(@"%@",str);
};
//调用
rlblock(@"Just Try For It!");
控制台打印结果:

2018-03-05 14:31:04.044298+0800 block[34643:1284532] Do You Like This? YES,I Do!
2018-03-05 14:31:04.044504+0800 block[34643:1284532] 计算结果 : 42
2018-03-05 14:31:04.044889+0800 block[34643:1284532] I am a aVoidBlock
2018-03-05 14:31:04.045363+0800 block[34643:1284532] Just Try For It!

block局部变量访问


/**
   堆区 block , 引用局部变量的block
   1、在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值
   2、在局部变量前使用__block修饰,在声明Block之后、调用Block之前对局部变量进行修改,在调用Block
      时局部变量值是修改之后的新值
   3、block中不能直接使用修改局部变量 若要修改 需要用 __block对局部变量进行修饰
 */
- (void) mallocBlock {

    //局部变量
    __block  NSString *mallocBlockStr = @"堆区block局部变量";

    void (^mallocBlock)(void) = ^(){
        mallocBlockStr = @"此时是对的"; //此举正确 如果去掉 __block修饰此处理应报错
        NSLog(@"%@", mallocBlockStr);
    };
    //申明后 、调用前修改局部变量,  实则使用的还是之前的变量值
    //如果想使用修改后的变量值,需要用 __block对局部变量进行修饰即可
//    mallocBlockStr = @"修改了没?";

    NSLog(@"%@", mallocBlock);
    mallocBlock();
}

block全局变量访问

/**
   全局blcok ,内存全局区
   未引用任何局部变量
   在声明Block之后、调用Block之前对全局变量进行修改,在调用Block时全局变量值是修改之后的新值
   在Block中可以直接修改 全局变量  (静态变量 同全局变量)
 */
NSString *globalStr = @"全局block变量引用";

- (void)globalBlock {

    //1、未引用任何外部变量
    void (^globalBlockTest) (NSString *) = ^(NSString *global){

        NSLog(@"%@",global);
    };

    NSLog(@"%@",globalBlockTest);

    //引用全局变量

    void (^globalBlockTest1)(void) = ^(){

        NSLog(@"%@",globalStr);
    };

    NSLog(@"%@",globalBlockTest1);

    globalBlockTest1();
}

block作为参数

Block作为C函数参数
#pragma mark - 1.定义一个形参为Block的C函数

void aBlockForC(int(^aBlock)(int, int))
{
    NSLog(@"Block For C result  = %d", aBlock(300,200));
}

aBlockForC(^(int x, int y) {
    return x+y;
});
block作为OC函数参数
-(void)aBlockForOC:(addBlock)aBlock {
    NSLog(@"Block For OC result = %d", aBlock(400,200));
}
-(void)aBlockForOC:(int(^)(int, int))aBlock {
     NSLog(@"Block For OC result = %d", aBlock(400,200));
}

源码, 只是害怕自己忘记了,留点儿证据,证明block这一块儿,我又来过!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值