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

iOS-block

2015-06-30 10:55 507 查看
代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。

脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)下图是如何把块变量赋值给一个变量的语法讲解:



lBlock封装了一段代码,可以在任何时候执行

lBlock可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

l苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

Blocks的定义:

int(^MySum)(int,int)= ^(inta,intb){
return a+b;
};


定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

Block可以访问局部变量,但是不能修改。

intsum =10;
int(^MyBlock)(int)= ^(int num){
sum++;//编译报错
return num*sum;
};


如果要修改就要加关键字:__block

__block int sum=10;

l定义函数指针
int(*myFn)();

l定义Blocks
int(^MyBlocks)(int,int);

l调用函数指针
(*myFn)(10,20);

l调用Blocks
MyBlocks(10,20);

l在声明的同时定义变量,然后赋值

int(^MySum)(int,int) = ^(int a,int b) {
return a + b;
};


l也可先用typedef先声明类型,再定义变量进行赋值

typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};


1、参数是NSString*的代码块

void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
{
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");


运行结果是:print:hello world!

2、代码用在字符串数组排序

NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2)
{
return [string1 compare:string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@", sortArray);


运行结果:sortArray:(

"abc 05",

"abc 1",

"abc 12",

"abc 13",

"abc 21"

)

3、代码块的递归调用

代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用

static void (^ const blocks)(int) = ^(int i)
{
if (i > 0) {
NSLog(@"num:%d", i);
blocks(i - 1);
}
};
blocks(3);


运行打印结果:

num:3

num:2

num:1

4、在代码块中使用局部变量和全局变量

在代码块中可以使用和改变全局变量

int global = 1000;
int main(int argc, const char * argv[])
{
@autoreleasepool {
void(^block)(void) = ^(void)
{
global++;
NSLog(@"global:%d", global);
};
block();
NSLog(@"global:%d", global);
}
return 0;
}


运行打印结果:

global:1001

global:1001

而局部变量可以使用,但是不能改变。

int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);


在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block



__block int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);


运行结果:[b]local:501[/b]

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