block学习笔记

介绍

block对象是C语言的语法和运行时特性。它与标准的C函数很相似,但是在运行代码的同时它还可以包含栈中或堆中的变量。因此,block对象可以在执行时保留一些可以用来影响运行行为的状态(数据)。

你可以使用block对象去组成可以被传递给API、可选的储存、或是被多线程使用的函数表达式。block在回调是尤其有用,因为block同时包含了用来执行的代码和在执行时需要的数据。

因为Objective-C和C++都是源自C语言的,所以在这三种语言中block都是可以使用的。

开始使用block

声明并使用block

使用^操作符来声明一个block变量,同时^操作符也指示了block字面量的开始。block的方法体由{}包住,如下例所示:

int multipier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multipier;
}

下图是这个例子的解释:

值得注意的是,这个block是可以使用与其定义在相同作用域内的变量的。

如果你将一个block声明成一个变量,你就可以把这个变量当做函数一样使用。

直接使用Block

在许多情况下,你并不需要声明一个block变量,取而代之的是你在需要使用block作为参数的地方内联的写一个block字面量表示。下面的例子使用了qsort_b函数,qsort_b与标准的qsort_r很相似,但是它将一个block作为最后的参数。

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };

qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
char *left = *(char **)l;
char *right = *(char **)r;
return strncmp(left, right, 1);
});

// myCharacters is now { "Charles Condomine", "George", "TomJohn" }

在Cocoa中的block

许多在Cocoa框架中的方法都将block作为一个参数,无论是在对象的集合中执行一个操作还是当一个操作完成时将block当做回调。如下的例子展示了如何在NSArray的sortedArrayUsingComparator:方法中使用block,这个方法只有一个参数——block。为做力争,在这个例子中block被定义成了一个NSComparator的本地变量。

NSArray *stringsArray = @[ @"string 1",
                       @"String 21",
                       @"string 12",
                       @"String 11",
                       @"String 02" ];

static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
    NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];

NSComparator finderSortBlock = ^(id string1, id string2) {

NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
};

NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
NSLog(@"finderSortArray: %@", finderSortArray);

/*
Output:
finderSortArray: (
"string 1",
"String 02",
"String 11",
"string 12",
"String 21"
)
*/

__block变量

block的一个强大的特性就是它可以改变与其在同一作用域中的变量。你可以通过在变量钱添加__block存储类型来告诉block这个变量是可以被修改的。调整一下 Blocks with Cocoa中的那个例子,可以使用了一个block变量来计算多少个字符串是相等的,调整后的代码如下。(在这个例子中没有定义block变量,而是直接使用了block)

NSArray *stringsArray = @[ @"string 1",
                      @"String 21", // <-
       
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值