您的位置:首页 > 移动开发 > IOS开发

iOS中Block介绍(一)基础

2015-04-30 17:22 302 查看

iOS中Block介绍(一)基础

一、概述

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标记,是无法通过编译的。

}

};

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: