block

#import <Foundation/Foundation.h>

// Block块的重定义
typedef int(^aBlock)(int, int);
typedef void(^bBlock)();

// 全局变量
int a = 100;

int main(int argc, const char * argv[])
{
    // 定义block
    // block类型为有参数有返回值
    // int 表示的是返回值,(int,int)表示的是参数类型,MyBlock表示的是block块的名字,^(托字符)的作用是block块的标识符
    int(^MyBlock)(int, int) = ^(int a, int b)
    {
        return a + b;
    };
    // 调用block
    int num = MyBlock(3, 4);
    NSLog(@"有参有返回值num ======%d", num);
    
    
    // 有参数无返回值
    void(^MyBlock1)(int, int) = ^(int a, int b)
    {
        NSLog(@"有参无返回值======%d",a * b);
    };
    MyBlock1(4, 5);
    
    
    // 无参数无返回值
    void(^MyBlock2)() = ^()
    {
        NSLog(@"无参无返回值======你瞅啥!!");
    };
    MyBlock2();
    
    
    // 无参数有返回值
    int(^MyBlock3)() = ^
    {
        int a = 3;
        int b = 5;
        int c = a + b;
        return c;
    };
    NSLog(@"无参数有返回值 ======%d",MyBlock3());
    
    
    // Block与全局变量、局部变量的关系:
    // a是全局变量,存放在全局区(静态区);c是局部变量,存放在栈区
    NSLog(@"a = %d, 地址:%p", a, &a);
    int c = 10;
    NSLog(@"c = %d, 地址:%p", c, &c);
    void(^myBlock)() = ^()
    {
        // block里可以访问外面的全局变量,并修改值;也可以访问外面的局部变量,但是不能改值
        a = 8;
        // a的地址没变
        NSLog(@"a = %d, 地址:%p", a, &a);
        
        // 这里c存放在堆区,block内部的局部变量,地址是拷贝过来的,存放在堆区
        NSLog(@"c = %d, 地址:%p", c, &c);
    };
    myBlock();
    
    // 如果想在block内部改变外部的值:
    __block int d = 10;
    NSLog(@"d = %d, 地址:%p", d, &d);
    void(^block)() = ^()
    {
        d = 12;
        NSLog(@"d = %d, 地址:%p", d, &d);
    };
    block();
    NSLog(@"d = %d, 地址:%p", d, &d);
    
    return 0;
}
demo截图

推荐阅读更多精彩内容