美文网首页程序员iOS
iOS Block概念、语法及基本使用

iOS Block概念、语法及基本使用

作者: 1江春水 | 来源:发表于2019-01-03 17:23 被阅读3次

系列文章:
iOS Block实现原理
iOS Block __block说明符

最近又翻了一遍《Objective-C高级编程》,每读一遍感觉都不一样,理解的东西印象更深了。在此做一下笔记。推荐iOS开发者细读几遍,很受益。

这篇简单说下Block语法及使用:

Block概要

什么是Block:带有自动变量(局部变量)的匿名函数

匿名函数:没有名称的函数。

自动变量:局部变量、函数参数。

其他语言中的Block的名称

程序语言 Block的名称
C+ Block Block
Smalltalk Block
Ruby Block
Python Lambda
C++ Lambda
JS Anonymous function
Block语法
^ 返回值类型 参数列表 表达式
例:
^ NSString * (NSString *str) {
        return [str stringByAppendingString:@"======"];
    };

返回值类型 参数列表可以省略;

^ 表达式
例:
^{
    NSLog(@"我是block");
    };
Block类型变量

block和C语言函数相比,除了没有^和函数名称,其他都相同。

声明Block类型变量并赋值:

NSString *(^block)(NSString *) = ^ NSString * (NSString *str) {
        return [str stringByAppendingString:@"======"];
    };
    
block(@"haha");//block调用
Block 变量赋值:
NSString *(^block1)(NSString *) = block;

也可以使用typedef来给Block变量起别名

typedef NSString * (^MyBlock)(NSString *);

使用MyBlock类型的属性

@property (nonatomic, copy) MyBlock block;

函数传递block类型参数

- (void)function:(NSString *(^)(NSString *name))block {
    NSString *str = NSStringFromSelector(_cmd);
    NSLog(@"%@",block(str));
}

block 作为函数返回值

- (NSString *(^)(NSString *))function:(NSString *)firstName {
    return ^NSString *(NSString *lastName) {
        return [firstName stringByAppendingString:lastName];
    };
}
NSString *(^block2)(NSString *) = [self function:@"xiao"];
NSLog(@"%@",block2(@"_ming"));
打印:xiao_ming

Block截获自动变量值

通过Block语法和Block类型变量,我们理解了带有自动变量值的 匿名函数 中的 匿名函数,而带有自动变量值究竟是什么呢? 带有自动变量值在Block中表现为 截获自动变量值,实现如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    int dmy = 256;
    int val = 10;
    const char *fmt = "val = %d\n";
    void (^blk)(void) = ^{
        printf(fmt,val);
    };
    val = 2;
    fmt = "These value were changed. val = %d\n";
    blk();
}

打印:val = 10 而不是These value were changed. val = 2

说明

在上述代码中,Block语法的表达式使用的是它之前声明的自动变量fmt和val。Block中,Block表达式截获所使用的自动变量的值,即保存该自动变量的瞬间值。因为Block表达式保存了自动变量的值,所以在执行Block语法后,即使改写Block中使用的自动变量的值也不会影响Block执行时自动变量的值。

__block说明符

在不加__block修饰符时,Block截获的是自动变量值的瞬间值,保存后就不能改写该值。

int val = 1;
void (^blk)(void) = ^{
    val = 2;
};
报错:Variable is not assignable (missing __block type specifier)变量不能被赋值,缺少__block

要想在Block内部改变变量的值,需要在变量前加上 __block
该变量称为__block变量。后边会说明,__block 到底做了哪些事情。

__block int val = 1;
void (^blk)(void) = ^{
    val = 2;
};

截获OC对象

NSMutableArray *array = [NSMutableArray array];
void (^blk)(void) = ^{
    [array addObject:@"haha"];
    //array = [NSMutableArray array];编译报错,缺少__block修饰符
};

赋值给截获的array对象会编译报错,但是使用截获的值却不会有任何问题。

本章要点:

  1. 什么是Block
  2. Block语法
  3. Block基本使用
  4. Block截获自动变量值
  5. __block 修饰符

相关文章

  • iOS Block实现原理

    系列文章:iOS Block概念、语法及基本使用iOS Block __block说明符iOS Block存储域及...

  • iOS Block存储域及循环引用

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block __block说明符...

  • iOS Block __block说明符

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block存储域及循环引用 上一...

  • iOS Block概念、语法及基本使用

    系列文章:iOS Block实现原理iOS Block __block说明符 最近又翻了一遍《Objective-...

  • iOS开发 多视角抛析匿名函数—— Block

    一.Block的基本使用1.概念在iOS开发中Block的使用随处可见,使用场景也非常多,例如在网络中进行网络请求...

  • iOS block的使用与深入理解

    一、block的基本语法与使用 概述Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...

  • Block

    Block基本语法 typedef声明,作Method参数使用 属性声明,使用copy修饰符 基本语法 声明Blo...

  • 关于Block块的所有所有

    关于Block: 在我们使用OC进行iOS开发和Mac OS开发中,Block语法是我们最常见的语法之一,而且苹果...

  • Block初步接触

    OC 日常笔记碎片知识 Block基本概念Block是iOS中一种比较特殊的数据类型. 苹果推荐使用的数据类型,应...

  • block的使用和注意

    iOS学习-(1)block的使用和注意 本文简介 本文主要介绍1.block的基本使用 ...

网友评论

    本文标题:iOS Block概念、语法及基本使用

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