iOS-block

来源:互联网 发布:棋牌游戏平台源码 编辑:程序博客网 时间:2024/04/28 19:52


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

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


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);  

运行结果:local:501

                    local:501


0 0
原创粉丝点击