Block用法

作者: 陌巷先森 | 来源:发表于2019-02-28 10:14 被阅读19次

概述

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);
};

参考:完整项目资料下载

相关文章

  • Swift之Block

    block用法

  • 关于Block

    1.Block基本用法: block声明返回值(^block变量名)(参数)void(^block)(); blo...

  • Kotlin的run,let,apply,also,with的用

    run函数 用法一 定义:public inline fun(block:()->R):R=block() 功能:...

  • 白话block

    本文内容 什么是block? block的用途 block的用法 block在使用中遇到的问题 如何使用xcode...

  • ios block用法与分析

    一: block的基础用法 block声明: int(^blockDemon)(inta,intb) ,其中int...

  • Block基础看它就够了

    Block基本用法 "Block语法" 1.作为方法时 - (void)testGlobalBlock:(NSSt...

  • Block用法

    概述 block:苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性。匿名函数:没有函数名的函数,一对...

  • block用法小结

    基本用法 作用block用来保存一段代码 block的标志: ^ block与函数block与函数很像1.可以保存...

  • iOS开发-block的使用(上)

    引言:本文旨在介绍block的基本用法,怎么定义一个block,怎样使用block. block的声明与定义 首先...

  • Block的学习

    基础部分 一 重要概念: 1 闭包 2 block 二 block的用法 1 block的声明,定义,调用: 声明...

网友评论

    本文标题:Block用法

    本文链接:https://www.haomeiwen.com/subject/ihawdftx.html