【Objective-C学习记录】第七天

代码块

  除了函数中的代码,代码块还包括变量绑定。代码块还有另一个名称:闭包(closure)。

  代码块保护两种类型的绑定:自动型与托管型。自动绑定使用栈中的内存,托管绑定使用堆中的内存。

  代码块的格式与函数指针的有点像。函数指针:void (*f)(void);代码块:void (^f)(void);只需把“*”换成“^”。

  然后我们来写一个代码块:

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

  int res = f(1,2);

  printf("res is %d ",res);

  这里通过代码块实现了计算两个数相加。语法概括如下:

  <returnType> (^blockName)(list of arguments) = ^(arguments){body;};

  //<返回类型>(^代码块名)(参数列表) = ^(参数){代码体;};

  注:编译器可以推断代码块的返回类型,所以可以省略它,当代码块没有参数时,参数也可以省略。如下(打印“Hello iOS”):

  void (^hello)() = ^{printf("Hello iOS ");};

  使用代码块不用写“^”,定义时需要添加,如:int res = f(1,2);跟函数一样。如果直接使用代码块,不需要创建一个代码块变量,直接关联内容即可,下面是一个对数组排序的功能:

  NSArray *array = [NSArray arraywithObjects:@"A",@"C",@"E",@"D",@"B",nil];

  NSArray *res = [array sortedArrayUsingComparator:^(NSString *obj1,NSString *obj2)]{

  return [obj1 compare:obj2];}];

  看起来好像JavaScript里的函数定义:)

  

  

原文地址:https://www.cnblogs.com/shvier/p/5031283.html