ios中block的学习总结

本文深入探讨了Objective-C中的Block机制,从声明与使用、与变量的关系到外部变量的获取与修改,全面阐述了其在异步操作与回调中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前简单的用过block,有时候知道怎么用,但为什么是这么写确总是一知半解,今天看了官方的文档,和一些大牛的博客,对block也有了大致了解;

block对于处理一些异步操作,和回调都方便了许多;

一.声明和使用一个Blocks

使用^操作符来来声明一个 block 变量和指示 block 文本的开始。Block 本身的主体被{}包含着,如下面的例子那样(通常使用 C 的 ;符合指示 block 的结束);

声明block如下:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};
如上所示在 int(^myBlock)(int)中第一个int为block的放回类型,^表示声明一个block变量,myBlock为block的命名,后面的int为block所传的参数类型,注:如果没有参数则传void:

该示例解析图如下


block的调用,如下:

myBlock(8);


2.另外一种声明,就是用于typeof这个关键字,在头文件声明该block的名称,如下所示:

typedef void(^MyBlockName)(int);        //block命名为MyBlockName


block的使用:

    //调用block
    MyBlockName name = ^(int num){
        
        NSLog(@"-------------%d",num);
    };
    name(9);
其实和之前差不多,只是有时候需要;


3.block和变量

3.1、变量类型

 在 block 的主体代码里面,变量可以被使用五种方法来处理。

 你可以引用三种标准类型的变量,就像你在函数里面引用那样:

a.全局变量,包括静态局部变量。

b.全局函数(在技术上而言这不是变量)。

c.封闭范围内的局部变量和参数。 

     Blocks 同样支持其他两种类型的变量:

在函数级别是__block变量。这些在block里面是可变的(和封闭范围),并任何引block 的都被保存一份副本到堆里面。

引入const

最后,在实现方法里面,blocks也许会引用Objective-C的实例变量。参阅“对象Block 变量”部分。

  在 block 里面使用变量遵循以下规则:

全局变量可访问,包括在相同作用域范围内的静态变量。

传递给block的参数可访问(和函数的参数一样)。

程序里面属于同一作用域范围的堆(非静态的)变量作为const变量(即只读)。

它们的值在程序里面的 block 表达式内使用。在嵌套 block 里面,该值在最近的封闭范围内被捕获。

属于同一作用域范围内并被__block存储修饰符标识的变量作为引用传递因此是可变的。

属于同一作用域范围内block的变量,就和函数的局部变量操作一样。

每次调用 block 都提供了变量的一个拷贝。这些变量可以作为 const 来使用,或在block 封闭范围内作为引用变量。 


block能获取外部变量如下所示:

int x = 123;
 
void (^printXAndY)(int) = ^(int y) {
 
    printf("%d %d\n", x, y);
};
 
printXAndY(456); // prints: 123 456
但不能在block里面修改外部变量的值;

如果需要在block中修改外部变量,使用__block类型存储修饰符,这样在block中就能修改外部变量,如下所示:

__block int x = 123; //  x lives in block storage
 
void (^printXAndY)(int) = ^(int y) {
 
    x = x + y;
    printf("%d %d\n", x, y);
};
printXAndY(456); // prints: 579 456






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值