博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Block介绍(一)基础
阅读量:6894 次
发布时间:2019-06-27

本文共 1596 字,大约阅读时间需要 5 分钟。

一、概述

Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

 

二、热身

先看一个比较简单的Block例子:

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

在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

来,让我们typedef一下

typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的blocktypedef int (^IntBlock)(void);//一个没有参数,返回int的blocktypedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block

三、更详细的例子

主动调用一下:

- (void)someMethod{    BoolBlock ablock = ^(BOOL bValue) {        NSLog(@"Bool block!");    };     ablock();}

作为参数返回:

typedef void (^BoolBlock)(BOOL);- (BoolBlock)foo(){    BoolBlock ablock = ^(BOOL bValue) {        NSLog(@"Bool block!");    };    return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解}

类的一个成员:

@interface OBJ1 : NSObject@property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们@end OBJ1 *obj1 = ...obj1.block = ^(BOOL bValue) {        NSLog(@"Bool block!");    };

其他函数的参数:

- (void)foo(BoolBlock block){    if (block) {        block();    }}

甚至其他block的参数:

BoolBlock bBlock = ^(BOOL bV){
if(Bv){
/*do some thing*/}};HugeBlock hBlock = ^(BoolBlock bB) {bB();}; hBolck(bBlock);

啊,全局变量!:

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标记:

int main(){    __block int i = 1024;    BoolBlock bBlock = ^(BOOL bV) {        if (bV) {            i++;//如果没有__block标记,是无法通过编译的。        }    };}

 

转载于:https://www.cnblogs.com/ghgyj/p/4002077.html

你可能感兴趣的文章
NSDECODER v1.0
查看>>
游侠原创:vmware下android-x86-4.4-RC1体验
查看>>
OpenMNS--管理网络的绝好工具
查看>>
ORACLE LINUX 6.1安装过程
查看>>
iPhone/Mac Objective-C内存管理原理
查看>>
整理Silverlight资源列表(三)-SL实际运用案例
查看>>
02-BGP选路原则和属性详解--weight
查看>>
7.[数据结构和算法分析笔记]词典 Dictionary
查看>>
CCNP精粹系列之八----帧中继全网拓扑试验配置
查看>>
Lync升级S4B秘籍,So Easy!!!
查看>>
SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例...
查看>>
android用户界面-组件Widget-进度条ProgressBar
查看>>
猜字谜小游戏编程
查看>>
【OneNote Mobile】 如何处理便签内容的格式?
查看>>
Algeco Scotsman将召开2016年第三季度业绩电话会议
查看>>
新加坡IMDA计划进行Li-Fi测试
查看>>
《深入理解大数据:大数据处理与编程实践》一一1.3 MapReduce并行计算技术简介...
查看>>
LoadRunner关联的高级应用
查看>>
如何减少返工工作量?
查看>>
《敏捷可执行需求说明 Scrum提炼及实现技术》—— 2.1 界定不可更改的边界
查看>>