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, 3, sizeof(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: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!

ObjC block入门相关推荐

  1. IOS开发基础之OC的Block入门_Day09-Block

    IOS开发基础之OC的Block入门_Day09-Block block是oc的重要的基础知识,重点之重.跟协议一样重要,是进行函数回调重要手段.在后续的UI学习具有举足轻重的地位.学会基础的bloc ...

  2. 汇编为什么分段执行总是执行不了_iOS汇编教程(六)CPU 指令重排与内存屏障...

    系列文章 iOS 汇编入门教程(一)ARM64 汇编基础 iOS 汇编入门教程(二)在 Xcode 工程中嵌入汇编代码 iOS 汇编入门教程(三)汇编中的 Section 与数据存取 iOS 汇编教程 ...

  3. Swift编程的15个技巧

    自2014年9月1.0版发布后,Savvy的应用开发团队就开始在iOS项目中实验并使用Swift.不过由于Swift相对还很新,当时大多项目仍在使用Objective-C:自从2015年9月Swift ...

  4. 支持iCloud简记

    苹果iOS上的iCloud对于应用有几层意义: 1.App可以像以前和iTunes同步时一样,把App数据备份到iCloud上.这部分功能是所谓out-of-box, just works,无需app ...

  5. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  6. ios逆向之frida简单教程

    1. 准备: mac电脑 越狱好的手机 一个待分析的app 2. app砸壳 文章参考https://www.jianshu.com/p/80c1311530c3 3. 反编译出头文件 文章参考htt ...

  7. HCIE-Cloud笔试

    前言: 目录按照HCIE-Cloud官方培训教材V2.0进行制定,通过笔试考点挂钩HCIE-Cloud官方培训教材V2.0中的知识,相互强化记忆 1.优点:基本笔试的知识分类,是按照该教材的目录大纲分 ...

  8. Block.one的EOS区块链入门开发教程Elemental Battles

    最新版本使任何可以使用JavaScript和C++的人都能轻松学习EOSIO. 10月18日,Block.one推出了Elemental Battles,这是一个激动人心的新工具包,它将通过简化EOS ...

  9. System Generator从入门到放弃(六)-利用Vivado HLS block实现VivadoHLS调用C/C++代码

    System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码 夜未央,流星落,情已殇 文章目录 System Generator从 ...

最新文章

  1. 约瑟夫问题(c++)
  2. 女孩子学电脑进入IT行业有什么优势?
  3. 工业用微型计算机(24)-汇编语言分段结构
  4. Vue学习笔记进阶篇——Render函数
  5. Java try和catch的使用介绍
  6. go语言练习:条件语句和循环语句
  7. html+link+点击次数,使用正则表达式,取得点击次数,函数抽离(示例代码)
  8. mysql dbutil_通过dbutil操作数据库
  9. DAS、NAS、SAN、IPSAN、iSCSI-SAN及IDE、SAS、SCSI、iSCSI简介
  10. mysql查询员工表中所有员工入职20个月之后的日期_新员工入职指南
  11. Securing Android: A Survey, Taxonomy, and Challenges --论文笔记
  12. uni-app 登录功能(2)
  13. python 判断完全平方数
  14. SL4A apk 编译生成
  15. cefsharp执行完js代码后获取返回值问题
  16. 数字科技行业的“挖井人”:京东数科不做一锤子买卖
  17. Java农夫过河问题的继承与多态实现
  18. Flash代码加密解决方法
  19. 高性能网站建设指南-前端性能优化(一)
  20. Linux配置ntp时间同步服务器(全)No association ID's returned

热门文章

  1. python适合做后端开发吗-想从事Python 后端开发?
  2. guava之ComparisonChain
  3. UVa12100 - Printer Queue
  4. tortoiseHG不用每次输入密码
  5. LeetCode Spiral Matrix II (生成螺旋矩阵)
  6. centos 5.5中如何由一般用户切换为root用户
  7. 题目1102:最小面积子矩阵
  8. Python之路,day3-Python基础
  9. LeetCode - Minimum Window Substring
  10. SQL Server 2012 开发新功能 序列对象(Sequence)