Objective-C学习之旅(十)----Blocks语法

一、Blocks

  Block是一个C Level的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从IOS4.0开始就很好地支持Blocks。Blocks主要用在一些回调函数的用法上,2个对象通信需要一些回调的时候,比如说2个对象在运行,我们需要知道其中一个对象什么时候完成,我们就需要一个回调函数,之前我们用代理,但是有些小的地方用代理大材小用,Blocks可以用来做一些代理的很好地支撑,可以用来做边界或者一些地方的回调函数。

心得:Blocks实质其实就是回调函数。

二、C函数指针和Blocks申明

 C语言函数指针 int (* CFunc)   (int          a)

        返回值 变量名  参数类型 参数值

  Blocks            int(^  BFunc)   (int    a)

三、C函数指针和Blocks调用

  1、C函数指针调用:

    int(* CFunc)(int a)函数调用

    int ret=CFunc(100);

  2、Blocks调用

    int(^BFunc)(int a)函数调用

    int ret=BFunc(100);
四、Blocks typedef 类型定义

  C语言函数指针typedef

  typedef int(*SumBlockT)(int a,int b)

  Blocks typedef 定义

  typedef int(^SumBlockT)(int a,int b)

五、_ _block关键字

  1、这个关键字主要是用在Blocks里面需要和一个函数通讯来修饰一些临时变量

  比如说:我们函数里面有一段blocks,这个blocks里面需要修改函数里面的一些方法, 那么函数里面的变量是一些临时变量,当这个函数调完了的时候,这个变量就没有了。就从这个栈当中销毁了。_ _blocks就是说可以让这个变量成为全局的。我们在Blocks里面调用的时候就可以修饰这里面的变量。

  2、一个Block的内部是可以引用自身作用域外的变量的,包括static变量,extern变量或自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中是只读的。在引入block的同时,还引入了一种特殊的_ _block关键字变量存储修饰符

六、Blocks案例

我们在给这个函数赋值的时候,myblocks3的变量sum还没有执行,因为sum是临时变量,也就是说我除了这个函数之外,这个变量在别的地方没有使用过,为了能再函数中能够访问到sum,我们在int sum=0之前加一个__block,这样sum就变成了一个全局变量。在回调函数里面就可以使用了。

复制代码
__block int sum = 0;
        int (^myblocks3) (int a, int b) = ^(int a, int b) {
            sum = a+b;
            return 3;
        };
        myblocks3(20, 30);
        NSLog(@"sum is %d", sum);
复制代码

 

复制代码
#import <Foundation/Foundation.h>
// 定义Blocks的typedef
typedef int (^SumBlockT) (int a, int b);

int main (int argc, const char * argv[])
{
    @autoreleasepool {        
        // insert code here...
        NSLog(@"Hello, World!");
        
        void (^myblocks) (void) = NULL;
        myblocks = ^(void) {
            NSLog(@"in blocks");
        }; // 给myblocks 赋值
        NSLog(@"before myblocks");
        myblocks(); // 执行myblocks;
        NSLog(@"after myblocks");
        /*
          before myblocks
          in blocks
          after myblocks
         */
        int (^myblocks2) (int a, int b) = ^(int a, int b) {
            int c = a+b;
            return c;
        };
        NSLog(@"before blocks2");
        int ret = myblocks2(10, 20);
        NSLog(@"after blocks2 ret %d", ret);
        
        __block int sum = 0;
        int (^myblocks3) (int a, int b) = ^(int a, int b) {
            sum = a+b;
            return 3;
        };
        myblocks3(20, 30);
        NSLog(@"sum is %d", sum);
        
        SumBlockT myblocks4 = ^(int a, int b) {
            NSLog(@"c is %d", a+b);
            return 0;
        };
        myblocks4(50, 20);
    }
    return 0;
}
复制代码

 

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、付费专栏及课程。

余额充值