Objective-C block(代码块)

Block是什么?

(block)是由LLVM提出的类似于lambda表达式的非标准C语言扩展,亦可以应用于Objective-CC++中。它的语法类似于这些函数中的闭包,即由大括号包括的语句块。block与C/C++中的函数指针相似

Block是在栈上面分配的


Objective-C中的3种Block

1.全局的静态Block:_NSConcreteGlobalBlock,不会访问任何外部变量

2.堆中的Block:_NSConcreteStackBlock,出栈既销毁

3.栈中的Block:_NSConcreteMallocBlock,和OC中对象一样,引用为0既销毁


Block功能?

一个Block是匿名的内联代码体,可以设置参数类型和返回参数类型,

block(库文件有要求)可以在C和C++上使用,但它还是OC对象

通常可以用作回调,例如Nav的Pop方法。


Block的数据结构(内存分布)图


PS:在Objective-C中每个对象都包含了这个isa指针,这个指针很常见,对象,KVO,block都有他




IOS许多地方能见到Block,系统函数中就有不少使用到的


Block简单的使用

下面是个简单的声明

int (^Multiply)(int, int) = ^(int num1, int num2) {
    return num1 * num2;
};
int result = Multiply(7, 4); // 返回值 28.这个是最简单的用法


-(void)NSlogHinumbera:(int)a numberb:(int)b   Function:(int (^)(int,int))testFunction
{
    int t1=5,t2=10;    
    
    //由于blocks是有返回值的,我们还可以在下面利用该值继续进行链式操作   这个是第二种使用方法
    int sum=testFunction(t1,t2);
    sum*=2;
    NSLog(@"sum=%d",sum);
}


声明成关键词

typedef int(^DaleBlocks)(int a,int b);//将这个类型的Blocks定义成关键字,使用起来会非常方便
    DaleBlocks blockModel=^(int a,int b)
    {
        return a+b;
    };


返回值类型 (^代码块名)(参数类型列表)=^(参数类型1 参数名1,...){Blocks主体};

 


如果想在Block中访问变量需要用__block来修饰
例如:
    __block int x=0;
上面这种在block体内(作用域)值能改变,但是出了block又变回最初的时候了 。这点跟普通函数很像(除非在C中传指针)
Apple文档中描述"  A block is an anonymous inline collection of code, and sometimes also called a "closure" "

clang工具可以帮助我们分析Block(它将OC源码改写成C)

深入学习Block
可参考文章:Apple-Blocks Programming Topics
 Wiki:   http://zh.wikipedia.org/wiki/块_(C语言扩展)
          摇滚诗人-对Objective-C中Block的追探:http://www.cnblogs.com/biosli/archive/2013/05/29/iOS_Objective-C_Block.html
          唐巧-谈Objective-C block实现: http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值