Object-C高级编程读书笔记(1)——Block的基本概念
来源:互联网 发布:蜘蛛侠淘宝上货软件 编辑:程序博客网 时间:2024/04/29 13:46
在OC中,引入了Block的概念,同时也有很多具体的应用。其功能类似于C语言中的函数指针,可将函数作为变量保存,传递,执行。
Block的声明方式
<span style="font-size:14px;">^返回值类型 参数列表 表达式例如^int(int count){ return count + 1;}</span>
Block变量
<span style="font-size:14px;">返回类型(^变量名称)(参数列表)例如, 一个叫做blk1的block变量int(^blk1)(int)</span>
Block类型的typedef
有时候我们需要将block类型作为函数参数或返回值,但block的语法会使函数的声明变得过于臃肿,可使用typedef为block类型起别名
<span style="font-size:14px;">typedef 返回类型(^别名)(参数列表)例如,typedef int(^blk_t)(int);则可用int fun(bulk_t blk);</span>
Block是带有自动变量值的匿名函数
在 OC高级编程这本书中,作者将block概况为“带有自动变量值的匿名函数”。该怎么理解它呢?
匿名函数,不用多说,重点则是“带有自动变量值”。
“带有自动变量值”可从两个点来理解
1.block内能够保持block外的变量值
若block内部使用了block外部的一个变量值,则block块则会对该变量做一个拷贝,即使block外该变量已经超出了作用域而释放,但block内部仍有一份拷贝值可以使用。
例如,在NSURLConnection中,其complete block是不会立即执行的(需要等到起URL操作完成才会执行),即使Block外的变量值已经失效释放,但是在URL 结束后调用complete block时,该变量仍可以在block中使用。(具体原因在后面会有涉及)
2.block是截取的变量的瞬时值
在前面已经说过,block会对block外的变量保持一份副本,来保证block执行时,该变量不会无法使用。但是应该注意的是,block只是保留的该变量传入block时的当时值,在block定义之后的对于该变量的任何改变,均不会影响到block内部使用该变量时的值。
例如
<span style="font-size:14px;">int var = 10;void (^blk)(void) = ^{printf("var =%d", var)};val = 2;blk(); // 当blk执行时,会使用其定义时var的瞬时值,即显示‘var = 10’</span>
3.__block说明符
默认的,对于block外的变量,block块内只能读,不能改变,否则会引起编译错误。但是在变量前加上__block,则告知编译器该变量可以在block内改变,编译通过。注意这里所说的变量改变,是说变量自身的改变,而不是变量不能够被操作。如对于截获的OC对象,我们不能够改变其对象指针所指向的内存,但是可以通过调用对象方法,改变对象内部的值。如
NSMutableArray对象
<span style="font-size:14px;">id array = [[NSMutableArray alloc] init];void(^blk)(void)=^{ id obj =[ [NSObject alloc] init]; [array addObject:obj];}</span>
这是可以通过编译的,而
<span style="font-size:14px;">id array = [[NSMutableArray alloc] init];void(^blk)(void)=^{ array = [[NSMutableArray alloc] init]; // 改变了array本身}</span>则会引发编译错误。
- Object-C高级编程读书笔记(1)——Block的基本概念
- Object-C高级编程读书笔记(2)——Block的实质
- Object-C高级编程读书笔记(3)——Block的变量截取
- Object-C高级编程读书笔记(5)——Block的对象类型截取
- Object-C高级编程读书笔记(6)—— GCD的一些函数
- Object-C高级编程读书笔记(4)——__block说明符
- 【读书笔记】Objective-C高级编程--Block模式1
- 【读书笔记】Objective-C高级编程--Block概要
- JS高级程序编程读书笔记:一.基本概念
- Object-C 的block使用
- UNIX环境高级编程读书笔记(十二)—高级IO (1)
- UNIX环境高级编程读书笔记(十二)—高级IO (1)
- C和指针读书笔记——基本概念
- 《Object-C高级编程 iOS与OS X多线程和内存管理》读书笔记之一
- 《Object-C高级编程 iOS与OS X多线程和内存管理》读书笔记之二
- Object - C Block 运用1
- object-c块(block)
- Object—C的规范编程
- 浅谈Java分布式计算
- php网站安全性问题
- Mysql配置文件my.ini详解
- leetcode-328-Odd Even Linked List
- 根据自己的身份账号ID查询性别及年龄
- Object-C高级编程读书笔记(1)——Block的基本概念
- hihoCoder 1269 优化延迟
- jQuery 遍历函数
- C#代码用F12转到定义时,不到源代码,而到元数据
- Android Studio 导入项目时路径中的中文出现乱码
- Elasticsearch DSL中Query与Filter的区别
- 魔术索引2
- ecshop显示商品已销售数量
- tomcat双击startup.bat闪退的办法