Block 代码块 / 闭包

Block是用来封装和保存代码,有点像函数,Block可以在任何时候执行,效率高。


根据Block在内存中的位置分为三种类型:

1、NSGlobalBlock:全局block,没有引用外部变量。如:

int a = 10;

void (^block)() = ^{

    NSLog(@"block");

};

block();

2、NSStackBlock:栈block,引用外部变量, 当函数返回时block将无效。

int a = 10;

void (^block)() = ^{

    NSLog(@"block %@", a);

};

block();

3、NSMallocBlock:堆block,对栈block进行copy,该办block就会从栈区复制到堆区,当函数返回时block依然有效。


block的用法:

1、作为属性。

比如:在Person类的.h文件定义属性:

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

使用时:

Person *p = [[Person alloc] init];

p.eat = ^(){

    NSLog(@"eat");

}

2、作为方法的参数(函数式编程)

比如:在Person类的.h文件定义:

- (void)eat:(void(^)())block;

使用:

Person *p = [[Person alloc] init];

[p eat:^{

    NSLog(@"eat");

}];

3、作为方法的返回值(链式编程)

如:Person类的.h文件定义:

- (Person *(^)(int m))run;

.m文件实现方法:

- (Person *(^)(int m))run {

    return ^(int m) {

        NSLog(@"跑了%@米", m);

        return self;

    };

}

使用:

Person *p = [[Person alloc] init];

p.run(200).run(300).run(400);


函数式编程:订阅代码与业务逻辑代码放一起。如AFN框架,网络请求的代码和得到请求结果的代码放一起。

响应式编程:当所有条件满足时就触发。如KVO,代理,通知都是响应式编程。

链式编程:简单理解就是通过连续“.”语法调用方法,方法返回的对象是方法本身。如Masonry框架。

(RAC,ReactiveCocoa框架,是函数响应式编程。)

你可能感兴趣的:(Block 代码块 / 闭包)