ObjC block入门

简介:

objC的block是基于c语言开发,可以在c,c++和objc中使用。

 

声明和使用一个block:

block中会用到一个特殊的操作符^。整个block体都放在{}中。

例如:

1  int multiplier =  7;
2  int (^myBlock)( int) = ^( int num) {
3      return num * multiplier;

4 };

 

借着这张E文的图,我们可以看到定义一个block是多么的简单。

从左到右依次是:myBlock要返回的类型,这里是int。myBlock就是我们block的名字,而^操作符表明此变量是个block。之后则是这个block需要输入的参数的类型。

赋值号后面的是这个block需要的参数,这里是num。大扩号中的是block体,也就是会执行到的代码块。我们看到,最后会返回一个整型值和定义的一样。

定义一个bock就是这么简单。在之后的代码中就可以使用这个block变量,就像使用一个函数一样。看例子:

1  int multiplier =  7;
2  int (^myBlock)( int) = ^( int num) {
3      return num * multiplier;
4 };
5  
6 printf( " %d ", myBlock( 3));

7 // prints "21"

 

直接使用一个bock:

很多时候就不需要定义block变量了。可以直接使用上例中赋值号右边的block块。我们来看这个例子:

复制代码
1  char *myCharacters[ 3] = {  " TomJohn "" George "" Charles Condomine " };
2  
3 qsort_b(myCharacters,  3sizeof( char *), ^( const  void *l,  const  void *r) {
4      char *left = *( char **)l;
5      char *right = *( char **)r;
6      return strncmp(left, right,  1);
7 });
8  
复制代码

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

 在这里例子中,block块直接当作函数实参的一部分传入了函数中。

 

在Cocoa中使用到的block:

这里不多说。直接上例子:

复制代码
 1 NSArray *stringsArray = [NSArray arrayWithObjects:
 2                                   @" string 1 ",
 3                                   @" String 21 ",
 4                                   @" string 12 ",
 5                                   @" String 11 ",
 6                                   @" String 02 ", nil];
 7  
 8  static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
 9         NSWidthInsensitiveSearch | NSForcedOrderingSearch;
10 NSLocale *currentLocale = [NSLocale currentLocale];
11  
12 NSComparator finderSortBlock = ^( id string1,  id string2) {
13  
14     NSRange string1Range = NSMakeRange( 0, [string1 length]);
15      return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
16 };
17  
18 NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
19 NSLog( @" finderSortArray: %@ ", finderSortArray);
20  
21  /*
22  Output:
23  finderSortArray: (
24      "string 1",
25      "String 02",
26      "String 11",
27      "string 12",
28      "String 21"
29  )
复制代码

30 */

 

__block变量:

block一个牛X的特性就是,block可以修改在同一个lexical scope(直译就是词法范围,好吧,我承认其他译法目前还没发现。等下上例子大家体会吧)中的__block变量。这些变量必须用__block修饰。看清楚block的前面实两道下划线!例子如下:

复制代码
 1 NSArray *stringsArray = [NSArray arrayWithObjects:
 2                           @" string 1 ",
 3                           @" String 21 "//  <-
 4                            @" string 12 ",
 5                           @" String 11 ",
 6                           @" Strîng 21 "//  <-
 7                            @" Striñg 21 "//  <-
 8                            @" String 02 ", nil];
 9  
10 NSLocale *currentLocale = [NSLocale currentLocale];
11 __block NSUInteger orderedSameCount =  0;
12  
13 NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^( id string1,  id string2) {
14  
15     NSRange string1Range = NSMakeRange( 0, [string1 length]);
16     NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
17  
18      if (comparisonResult == NSOrderedSame) {
19         orderedSameCount++;
20     }
21      return comparisonResult;
22 }];
23  
24 NSLog( @" diacriticInsensitiveSortArray: %@ ", diacriticInsensitiveSortArray);
25 NSLog( @" orderedSameCount: %d ", orderedSameCount);
26  
27  /*
28  Output:
29   
30  diacriticInsensitiveSortArray: (
31      "String 02",
32      "string 1",
33      "String 11",
34      "string 12",
35      "String 21",
36      "Str\U00eeng 21",
37      "Stri\U00f1g 21"
38  )
39  orderedSameCount: 2
复制代码

40 */

 大家看到变量orderedSameCount在后面的变量中做了自增操作。

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!


















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/archive/2011/12/14/2287706.html ,如需转载请自行联系原作者
相关文章
|
8月前
|
iOS开发
iOS block修饰符用copy还是strong
iOS block修饰符用copy还是strong
100 0
|
存储 缓存 算法
iOS-底层原理 11:objc_class 中 cache 原理分析
iOS-底层原理 11:objc_class 中 cache 原理分析
101 0
iOS-底层原理 11:objc_class 中 cache 原理分析
|
iOS开发
iOS-底层原理 04:NSObject的alloc 源码分析
iOS-底层原理 04:NSObject的alloc 源码分析
105 0
iOS-底层原理 04:NSObject的alloc 源码分析
|
编译器 API C语言
objc_msgSend分析
本文主要是对objc_msgSend的分析理解, 在分析cache_t的流程时, 我们只分析了写入流程, 其实还有一个cache读取流程, 有objc_msgSend和cache_getImp.
103 0
objc_msgSend分析
Block的底层原理
block-> 全局区;block -> 访问外界变量(copy) -> 强引用 -> 堆区;-> _weak可弱引用 -> 栈区
125 0
|
存储 iOS开发 MacOS
深入解析 ObjC 中方法的结构
因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 在上一篇分析 isa 的文章从 NSObject 的初始化了解 isa中曾经说到过实例方法被调用时,会通过其持有 isa 指针寻找对应的类,然后在其中的 class_d
1532 0