iOS中Block的简单介绍


Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其它的函数或者Block。

第一部分:Block基本的声明与实现

Block声明形式如下:

返回值类型(^Block名)(参数列);

返回值类型(比如void,int等),Block名即自己为这个Block取得名字,参数列(比如 int a, int b, int c)如果没有参数列要写成: ()。

Block实体形式如下:

^(传入参数列){行为主体};

Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列最好要写成: ^(void)。

1.先来看一个最简单的例子

//先声明再实现行为主体
    void(^aBlock)(NSString *x);
    aBlock=^(NSString *x)
    {
        NSLog(@"%@",x);
    };
    aBlock(@"hello world!");
当然也可以在声明的同时实现行为主体
//无返回值和参数
    void(^aVoidBlock)()=^(void)
    {
        NSLog(@"i am a aVoidBlock");
    };
    aVoidBlock();
    
    //有返回值和参数
    int a=3;
    int(^myBlock)(int)=^(int num)
    {
        return num*a;
    };
    int result=myBlock(9);
    NSLog(@"result==%d",result);

2.如果只是上面这些,Block也就没有那么吸引人了,除了这些之外,Block和可以作为函数的参数进行传递

下面来看一个小例子:

首先,定义一个我们需要的代码块新类型MainBlock,是这样的

typedef int(^MainBlock)(int x,int y);
然后写一个方法,该方法的参数类型就是我们定义的新类型MainBlock
-(void)useCodeBlockint:(MainBlock)block
{
    int result=block(300,200);
    NSLog(@"result======%d",result);
}
之后就可以调用该方法并且可以给它传MainBlock类型的参数
MainBlock sendBlock=^(int x,int y)
{
    return x+y;
};
[self useCodeBlockint:sendBlock];

第二部分:代码块如何访问局部变量和全局变量

点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值