ios中Block介绍

转载自http://mobile.51cto.com/hot-403897.htm
一、概述
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参数,没有返回值的block 
typedef int (^IntBlock)(void);//一个没有参数,返回int的block 
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block 
三、更详细的例子
注意:上面的typedef都还有效~


主动调用一下:


- (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外声明的栈变量,那么一定要对该变量加__block标记:


int main() 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值