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概要 Block:带有自动变量的匿名函数。 匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作...
    zweic阅读 3,405评论 0 2
  • 《Objective-C高级编程》是一本有趣又难懂的书,全书就讲了引用计数、Block、GCD三个概念,有趣是因为...
    kamous阅读 55,442评论 22 206
  • 一、 block语法格式,如下 //return type (^BlockName)(list of argume...
    原野de呼唤阅读 7,079评论 2 5
  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C语言的扩充功能——“带有自动变量(即局部...
    SkyMing一C阅读 6,963评论 6 18
  • 前言 1、理解Block其实就是一个代码块。本质上来说,一个Block就是一段能够在将来被执行的代码。然而Bloc...
    zdl阅读 1,930评论 0 1