iOS: Block使用指南

1.block的声明

返回值类型(^block的名字)(参数类型);

  • 无参无返回值的block
    void(^block1)();
  • 有参无返回值的block
    void(^block2)(int);
  • 无参有返回值的block
    int(^block3)();
  • 有参有返回值的block
    int(^block4)(int, int);

记不住block的语法怎么办?

直接敲inlineBlock会有提示,或者上这个网站http://fuckingblocksyntax.com

2.block的赋值

返回值类型(^block的名字)(参数类型) = ^(参数类型 参数){
代码
}

  • 无参无返回值的block
    void(^block1)() = ^() {
        NSLog(@"");
    };
  • 有参无返回值的block
    void(^block2)(int) = ^(int a) {
        NSLog(@"a");
    };
  • 无参有返回值的block
    int(^block3)() = ^() {
        return 22;
    };
  • 有参有返回值的block
    int(^block4)(int, int) = ^(int a, int b) {
        return a + b;
    };

3.block的调用

  • 无参无返回值的block的调用
    block1();
  • 有参无返回值的block的调用
    block2(2);
  • 无参有返回值的block的调用
    int c = block3();
  • 有参有返回值的block的调用
    int d = block4(1, 2);

4.block作为属性使用

@property(nonatomic,copy)返回值类型(^block的名字)(参数类型);

@property(nonatomic,copy)void(^myBlock)();

或者可以给block起一个别名

typedef void(^Block)();
@property(nonatomic,copy)Block block;

4.block作为代理使用(传值和调用其他类中的方法)

代理同样可以实现这两种功能,block在这种使用情况下可以和代理做一个类比.
代理使用的时候代理者和被代理者都需要实现三个步骤:
被代理者

  1. 定义一个协议
  2. 拥有代理属性
  3. 在合适的时候调用代理方法

代理者

  1. 遵守代理协议
  2. 将代理设置给自己
  3. 实现代理方法

block:
被代理者

  1. 声明一个block属性
  2. 在合适的时候调用block

代理者:

  1. 给block赋值

代码实现:
控制器A跳转到控制器B,实现在控制器B中调用控制器A中的方法并且传一个值给控制器A
控制器B中的代码:

@property(nonatomic,copy)void(^myBlock)(int a);
//按钮点击方法
- (IBAction)transmit:(id)sender {
    if (self.myBlock != nil) {
        self.myBlock(2);
    }
}

控制器A中的代码:

    newVC.myBlock = ^(int a) {
        NSLog(@"%d", a);
        //调用控制器A中的方法 
        [self functionOfControllerA];
    };

跟代理一样,传值是通过参数实现的.不需要传值的话就不用写参数.

5.作为函数参数使用

作为函数的参数使用的时候多数是用来回调.
以下载图片为例:

//下载图片的方法
- (void)downloadImgSuccess: (void(^)(UIImage *img))successBlock failure: (void(^)())failureBlock {
//在这里写下载图片的代码
    if (下载失败) {
        //下载失败的回调方法
        failureBlock();
    } else {
        //下载成功 将图片回调回去
        successBlock(img);
    }
}
//调用下载图片方法
    [self downloadImgSuccess:^(UIImage *img) {
        //下载成功后执行的代码
        weakSelf.imageView = img;
        NSLog(@"成功");
    } failure:^{
        //下载失败后执行的代码
        NSLog(@"失败");
    }];

6.block为什么要使用copy关键字修饰??

在MRC环境下:
block没有引用外部局部变量,block存储在全局区.
block引用了外部局部变量,block存储在栈区
在ARC环境下:
block没有引用外部局部变量,block存储在全局区
block引用了外部局部变量,block存储在堆区
局部变量是存储在栈区的,栈区中的变量超出作用域后会被回收,所以需要使用copy关键字将局部变量拷贝一份到堆区,防止block因为访问已经回收的局部变量发生野指针错误.

注意:在block中使用self关键字的时候注意将self处理成弱引用以免发生循环引用

__weak typeof(self) weakSelf = self;
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值