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

作者 : 开心源码 本文共2117个字,预计阅读时间需要6分钟 发布时间: 2022-05-12 共191人阅读

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

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

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

Block概要

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

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

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

其余语言中的Block的名称

程序语言Block的名称
C+ BlockBlock
SmalltalkBlock
RubyBlock
PythonLambda
C++Lambda
JSAnonymous 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 修饰符

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS Block概念、语法及基本使用

发表回复