ios中block的学习总结

来源:互联网 发布:nmath 非线性优化 编辑:程序博客网 时间:2024/06/05 16:16

之前简单的用过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的名称,如下所示:

typedefvoid(^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






0 0
原创粉丝点击