Block(一)基础-b
一、概述
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
二、热身
先看一个比较简单的Block例子:
1
2
3
4
|
int multiplier = 7 ; int (^myBlock)( int ) = ^( int num) { return num * multiplier; }; |
在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?
来,让我们typedef一下
1
2
3
|
typedef void (^BoolBlock)( BOOL ); //一个只接受一个BOOL参数,没有返回值的block typedef int (^IntBlock)( void ); //一个没有参数,返回int的block typedef BoolBlock (^HugeBlock)(IntBlock); //看看,这个HugeBlock的参数和返回值都是block |
1
|
|
三、更详细的例子
注意,上面的typedef都还有效~
主动调用一下:
1
2
3
4
5
6
7
8
|
- ( void )someMethod { BoolBlock ablock = ^( BOOL bValue) { NSLog ( @ "Bool block!" ); }; ablock(); } |
作为参数返回:
1
2
3
4
5
6
7
8
|
typedef void (^BoolBlock)( BOOL ); - (BoolBlock)foo() { BoolBlock ablock = ^( BOOL bValue) { NSLog ( @ "Bool block!" ); }; return [ablock copy ] ; //一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解 } |
类的一个成员:
1
2
3
4
5
6
7
8
|
@interface OBJ1 : NSObject @property ( nonatomic , copy )BoolBlock block; //理由同上啊,同学们 @end OBJ1 *obj1 = ... obj1.block = ^( BOOL bValue) { NSLog ( @ "Bool block!" ); }; |
其他函数的参数:
1
2
3
4
5
6
|
- ( void )foo(BoolBlock block) { if (block) { block(); } } |
甚至其他block的参数:
1
2
3
4
|
BoolBlock bBlock = ^( BOOL bV){ if (Bv){ /*do some thing*/ }}; HugeBlock hBlock = ^(BoolBlock bB) {bB();}; hBolck(bBlock); |
啊,全局变量!:
1
2
3
4
5
6
|
static int (^maxIntBlock)( int , int ) = ^( int a, int b){ return a>b?a:b;}; int main() { printf( "%d\n" , maxIntBlock( 2 , 10 )); return 0 ; } |
好了,你知道block大概能怎么用了。
四,特殊的标记,__block
如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:
1
2
3
4
5
6
7
8
9
|
int main() { __block int i = 1024 ; BoolBlock bBlock = ^( BOOL bV) { if (bV) { i++; //如果没有__block标记,是无法通过编译的。 } }; } |
Block(一)基础-b的更多相关文章
- iOS中Block的基础用法
本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...
- [HMLY]10.iOS中block的基础用法
本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...
- iOS中Block介绍 基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- swift基础语法(四) 函数、闭包(Closures)
//函数基本定义 func 函数名(参数名:参数类型=默认值) ->返回值类型{代码块} //无参无返回值函数 func hsmin(){ } //单参无返回值函数 func prin(st:S ...
- iOS 学习 - 9.Block 入门
来自李明杰的视频. block 用来保存一段代码 block 的标志:^ block 跟函数很像: 1).可以保存代码 2).有返回值 3). 有形参 temp1:没有返回值.没有形参的 blo ...
- Block 的基本用法
iOS中Block的基础用法 转载自简书 本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对 ...
- block没那么难(三):block和对象的内存管理
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 ...
- Block 进阶
转载自:http://www.cnblogs.com/xiaofeixiang/p/4666796.html 关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写 ...
- hadoop - 基础操作
查看文件: [root@hadoop hadoop]# hadoop fs -lsr /drwxr-xr-x - root supergroup 0 2016-12-27 10:49 /homedrw ...
- iOS开发-Block回调
关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...
随机推荐
- [Git] Undo a commit that has already been pushed to the remote repository
If we pushed our changes already to the remote repository we have to pay attention to not change the ...
- 分享几套生成iMac相关高逼格免费mockup的素材和在线工具
好久没有过来转, 今天姐姐我分享几套高逼格的iMac相关设计资源, 希望各位靓妹帅哥会喜欢, 最重要滴是,都是FREE,此处应有掌声~~~ , yeah!! iMac桌面效果Mockup 只需要下载后 ...
- 在CentOS 7上安装Kafka
简介 Kafka 是一种高吞吐的分布式发布订阅消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被广泛用于大规模消息数据处理应用. ...
- javascript数组操作大全-原创
//1.join() 方法用于把数组中的所有元素放入一个字符串,并通过指定的分隔符进行分隔. //语法:stringObject.join(a)这是它的语法 //a指定分隔符的任意字符串 //返回值: ...
- MVC 之 缓存机制(二)
八.应用程序缓存 应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中. 使用应用程序缓存与使用应用程序状态类似. 但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的, 即数据 ...
- JavaScript 之 动态加载JS代码或JS文件
2.动态加载JS文件 <script type="text/javascript"> function loadScript(url, callback) { var ...
- SQL字符串分割解析
常用以下三种: [1]substring( expression ,start , length ): [2]CHARINDEX ( expression1 , expression2 [ , sta ...
- 【树莓派】crontab设置Linux设备定时重启
简介:设置Linux设备定时重启或者关机 问题:有台设备每天总需要使用的人手动重启一下才可以正常工作,但是检查了日志,看起来服务一切都正常.时间和正确时间相差4mins. 解决办法: 1.增加定时任务 ...
- 【树莓派】使用xdrp远程登录树莓派的图形界面
之前采用了vnc方式方式的树莓派,但是配置还有点步骤,刚才看了一下,试验了一下xrdp,直接很简单就好了. 树莓派DIY笔记之前有介绍过用VNC连接到树莓派的方法.在Windows下,当然还是自带的远 ...
- MySql SqlServer Sqlite中关于索引的创建
最近要更新Cocon90.Db库,令其ORM创建表时实现索引的添加.因此总结下列常用Sql,供大家学习与参考. 一.SqlServer中创建索引可以这样: ) Create Table Test ( ...