OC block声明和使用

#import "Button.h"

typedef int (^MySum) (int, int);

void test() {
    // 定义了一个block,这个block返回值是int类型,接收两个int类型的参数
    int (^Sum) (int, int) = ^(int a, int b) {
        return a + b;
    };
    int a = Sum(10 ,11);
    
    NSLog(@"%i", a);
}

void test2() {
    // __block有2个下划线
    __block int c = 15;
    
    // 声明了一个block变量
    MySum sum = ^(int a, int b) {
        // 如果外部的变量用了__block关键字,就可以在block内部修改这个变量
        c = 19;
        
        // block可以访问外面定义的变量
        NSLog(@"c is %i", c);
        
        return a + b;
    };
    
    NSLog(@"%i",  sum(10, 10));
}


int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Button *btn = [[[Button alloc] init] autorelease];
        
        btn.block = ^(Button *btn) {
            NSLog(@"按钮-%@被点击了", btn);
        };
        
        // 模拟按钮点击
        [btn click];
    }
    return 0;
}

补充:

#import <Foundation/Foundation.h>

int sum(int a, int b) {
    return a + b;
}

void test() {
    int (^Sum) (int, int) = ^(int a, int b) {
        return a + b;
    };
    
    // block
    int c = Sum(10, 9);
    NSLog(@"%i", c);
    
    // 函数
    c = sum(10, 10);
    NSLog(@"%i", c);
    
    int (*sump) (int, int) = sum;
    c = (*sump)(9, 9);
    NSLog(@"%i", c);
}

typedef char * String;

void test1() {
    // 定义了Sum这种Block类型
    typedef int (^Sum) (int, int);
    
    // 定义了sump这种指针类型,这种指针是指向函数的
    typedef int (*Sump) (int, int);
    
    // 定义了一个block变量
    Sum sum1 = ^(int a, int b) {
        return a + b;
    };
    
    int c = sum1(10, 10);
    NSLog(@"%i", c);
    
    // 定义一个指针变量p指向sum函数
    Sump p = sum;
    // c = (*p)(9, 8);
    c = p(9, 8);
    NSLog(@"%i", c);
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        test1();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/liuwj/p/6899871.html