《企业级ios应用开发实战》一3.5 块编程

简介: 本节书摘来自华章出版社《企业级ios应用开发实战》一 书中的第3章,第3.5节,作者:杨宏焱,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.5 块编程

C语言的运行时特性中包括了块,标准C工作组的 N1370: Apple’s Extensions to C 中(其中也包括垃圾回收)对块进行了定义。作为C语言的扩展,Objective-C在OSX 10.6及iOS 4.0以后支持块语法。块运行时也会被集成到LLVM的compiler-rt子项目存储库中。

3.5.1 块的特点

一些面向对象的动态语言如ruby、groovy,都提供了对块的支持(在groovy中,块被称作为闭包“closure”)。块是用一对{}括号括起来的多个语句的集合。类似于函数,但不同于函数,可以把块作为表达式或变量的一部分,或者作为参数传递。在作为参数传递块时,代码被作为数据的一部分进行传递。
块具有以下特征:
同函数一样,有类型化参数列表。
有返回结果或者要申明返回类型。
能获取同一作用域(与块所在同一作用域)内的状态。
可以修改同一作用域的状态(变量)。
与同一范围内的其他块同享变量。
在作用域释放后能继续共享和改变同一范围内的变量。
除以上特点外,甚至可以复制块并传递到其他后续执行的线程,编译器和运行时负责把所有块引用的变量保护在所有块的拷贝的生命周期内。当然,这已经超出了本章的范围,可以参考苹果官方文档来了解这些内容。

3.5.2 Objective-C 中的块

对于C和C++,块是变量,但对于Objective-C,块仍然是对象。下面简单介绍Objective-C中的块。
1.块变量声明
用^操作符声明一个块变量的开始,分号表示块结束,如下代码所示:

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

块语法比较奇怪,块变量声明的解释如图3-2所示。
screenshot

块变量的声明语句从前至后分为了几部分:
返回值类型,如int、double,如果未显式地声明块的返回值类型,可能会自动从块代码中推断返回类型(通过return语句)。
块变量名用括号括住,块变量名前加^符号。
参数类型用括号括住,多个参数以逗号分隔,如果参数列表为void,而且返回类型依靠推断,可以省略参数列表的void。
等号,将后面的块赋值给前面的块变量(即myBlock)。
以^开头并以;结束的块定义。
块定义中又分为以下两个部分(除去开头的^和结尾的;外):
参数列表,同函数的参数列表。
块体,同函数体。
值得注意的是,块可以使用同一作用域内定义的变量,而函数不行。
一旦声明了块,你可以像使用函数一样调用它:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num  multiplier;
};
printf ( "%d", myBlock(3));

2.行内块
有时候,你不准备重复使用某个块,因此你不必为它想一个名称。那你可以使用行内块而不用声明为块变量。以下代码来自苹果文档:
// gsort_b类似标准的 gsort_r 函数,但它最后一个参数是一个块。

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 现在是 { "Charles Condomine", "George", TomJohn" }

在qsort_b 方法调用中,第4个参数就是一个匿名的块(行内块)。匿名块跟块变量不同,它没有变量名,因此你无法重用匿名块。下次调用这个块时,必须把整个块定义的代码再复制一遍。
3.__block关键字
块允许访问本地变量。这很重要。它使得我们在线程间共享变量变得简单,而且,你可以规定一个本地变量是否可以写,这可通过使用__block关键字,这是一种类类似register、auto和static存储类型修饰符。
用__block修饰的变量,可以在所有同一作用域内的块,以及块复制之间共享数据。在指定作用域内的多个块能同时使用共享变量。
如同块,__block变量也使用栈存储。如果使用block_copy拷贝块(或者向块发送copy消息),变量被拷贝到堆里。而且,__block变量的地址随后就会改变。
__block变量有两个限制:不能是可变长度的数组,也不能是包含C99可变长度数组的结构体。
下面显示了__block变量的使用:

__block int x = 123; //  x 是块可写的
void (^printXAndY)(int) = ^(int y) {
      x = x + y; 
      printf("%d %d\n", x, y);
};
printXAndY(456); // 打印出: 579 456
// x 现在的值是:579

下面显示了在块中使用多种类型的变量:

extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
      NSInteger localCounter = 42;
      __block char localCharacter;
      void (^aBlock)(void) = ^(void) {
            ++CounterGlobal;
            ++CounterStatic;
            CounterGlobal = localCounter; 
            localCharacter = 'a';
      };
      ++localCounter; 
      localCharacter = 'b';
      aBlock(); 
}
相关文章
|
2月前
|
iOS开发 开发者
苹果iOS App Store上架操作流程详解:从开发者账号到应用发布
很多开发者在开发完iOS APP、进行内测后,下一步就面临上架App Store,不过也有很多同学对APP上架App Store的流程不太了解,下面我们来说一下iOS APP上架App Store的具体流程,如有未涉及到的部分,大家可以及时咨询,共同探讨。
|
2月前
|
开发者 iOS开发
iOS应用上架详细图文教程(上)
App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上架流程开始梳理,详细了解下iOS app上架的那些事。
|
2月前
|
Swift iOS开发 开发者
iOS 应用上架流程详解
iOS 应用上架流程详解
|
27天前
|
安全 数据安全/隐私保护 虚拟化
iOS应用加固方案解析:ipa加固安全技术全面评测
iOS应用加固方案解析:ipa加固安全技术全面评测
36 3
|
1月前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
77 0
|
1月前
|
Web App开发 前端开发 网络安全
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
【2月更文挑战第21天】前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
47 1
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
|
2月前
|
Linux Android开发 iOS开发
iOS 应用上架的步骤和工具简介
APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店。最重要的是,即使没有配置Mac苹果机,也可以使用该工具完成一系列操作,包括iOS证书申请、创建iOS开发者证书和 iOS发布证书等各类证书。此外,在Windows、Linux或Mac系统中上传IPA到App Store也变得简单快捷,从而大大简化了iOS APP上架的流程。
|
2月前
|
移动开发 前端开发 安全
保护你的 iOS 应用,防止逆向破解
保护你的 iOS 应用,防止逆向破解
|
2月前
|
存储 安全 数据安全/隐私保护
iOS应用上架详细图文教程(下)
我们这边介绍一个简便的证书制作小方法。
|
2月前
|
安全 算法 数据安全/隐私保护
iOS 代码加固与保护方法详解 - 提升 iOS 应用安全性的关键步骤
iOS 代码加固与保护方法详解 - 提升 iOS 应用安全性的关键步骤