块(Blocks)

作者:追风剑情 发布于:2019-2-26 15:50 分类:Objective-C

块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是由Apple公司添加到语言中的。

示例

  1. #import <Foundation/Foundation.h>
  2.  
  3. // 块能够定义为全局的或者局部的
  4.  
  5. void (^calculateTriangularNumber) (int) =
  6. ^(int n) {
  7. int i, triangularNumber = 0;
  8. for (i = 1; i <= n; ++i)
  9. triangularNumber += i;
  10. NSLog(@"Triangular number %i is %i", n, triangularNumber);
  11. };
  12.  
  13. // 计算两个数的最大公约数
  14. int (^gcd) (int, int) =
  15. ^(int u, int v) {
  16. int temp;
  17. while ( v != 0 )
  18. {
  19. temp = u % v;
  20. u = v;
  21. v = temp;
  22. }
  23. return u;
  24. };
  25.  
  26. int main(int argc, const char * argv[]) {
  27. @autoreleasepool {
  28. // Objective-C中的块类似于C#中的匿名函数
  29. // 等号左边表示printMessage指向一个没有参数和返回值的块指针。
  30. void (^printMessage) (void) =
  31. ^(void) {
  32. NSLog(@"Programming is fun.");
  33. };
  34. printMessage();
  35. calculateTriangularNumber(10);
  36. calculateTriangularNumber(20);
  37. calculateTriangularNumber(50);
  38. // 块可以访问在其范围内定义的变量。变量的值同时作为块中定义的值。
  39. int foo = 10;
  40. // 插入块修改器 __block
  41. __block int moo = 10;
  42. void (^printFoo) (void) =
  43. ^(void) {
  44. NSLog(@"foo = %i", foo);
  45. NSLog(@"moo = %i", moo);
  46. // 不可以在块内部修改已经编译过的外部变量值
  47. //foo = 20; // ** 该行会产生编译错误
  48. moo = 20; // 因为外部变量moo用了__block关键字,所以块内部可以修改其值
  49. };
  50. foo = 15;
  51. moo = 15;
  52. printFoo();
  53. }
  54. return 0;
  55. }

运行测试
111.png

标签: Objective-C

« 结构 | 函数»
Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号