Block用法

概述

block:苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性。
匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作用域。

block语法

  • block变量声明: 返回值类型(^block变量名)(参数列表);
//声明一个无返回值,有两个int类型参数的,叫做blk的block
void(^blk)(int a, int b);
  • block表达式语法:^返回值类型(参数列表){表达式};
//无参数无返回值的block表达式
^void(void){
    NSLog(@"这是block块");
};
  • block变量赋值: 返回值类型(^block变量名)(形参类型) =^(形参列表){表达式};
//定义了一个返回值为int型,有两个int类型参数的,叫做add的block。表达式内将两个int参数相加,并将结果返回
int(^add)(int,int) = ^(int a,int b) {
        int c = a+b;
        return c;
};
int result = add(5,4);
NSLog(@"result----%d",result);

使用typedef简写格式为:typedef 返回值类型(^block变量名)(形参列表)

//用typedef定义一个block
typedef int(^ADD)(int,int);
// ADD就变为了一种Block类型,可以像声明变量一样来声明ADD
ADD add_k = ^(int a,int b) {
    int c = a+b;
    return c;
};
int result_k = add_k(4,2);
NSLog(@"result_k----%d",result_k);

block与外界变量

截获自动变量值

对于 block 外的变量引用,block 默认是将其复制到其数据结构中来实现访问的。也就是说block的自动变量截获只针对block内部使用的自动变量, 不使用则不截获, 因为截获的自动变量会存储于block的结构体内部, 会导致block体积变大。特别要注意的是默认情况下block只能访问不能修改局部变量的值。

int a = 10;
void(^blk)(void) = ^(void) {
    NSLog(@"block内部a----%d",a);
};
a = 15;//Block外修改a,不影响block内的自动变量
blk();//block内部a----10
NSLog(@"a----%d", a);//a----15

__block 修饰的外部变量

对于用__block修饰的外部变量引用,block 是复制其引用地址来实现访问的。block可以修改__block修饰的外部变量的值。

__block int a = 10;a为__block变量,可在block中重新赋值
void(^blk)(void) = ^(void) {
    NSLog(@"block内部a----%d",a);
};
a = 15;
blk();//block内部a----15
NSLog(@"a----%d", a);//a----15

防止block循环引用

对block内要使用的对象A使用__weak进行修饰,block对对象A弱引用打破循环。

__weak typeof(self) weakSelf = self;
self.blk = ^{
    NSLog(@"In Block : %@",weakSelf);
};

参考:完整项目资料下载

你可能感兴趣的:(Block用法)