iOS 与OS X高级编程和内存管理-Blocks(一)

前言:

iOS 与OS X高级编程和内存管理-Blocks(一)_第1张图片
cover.png

这本书是同学推荐的,现在将一些知识点概括出来。

本书分为三大部分,依次为:自动引用计数,Blocks, GCD。

由于之前有翻过一些关于内存管理的一些文章,所以我把自动引用计数放在最后才读。这篇文章为Blocks篇第一篇。

正文:

什么是Blocks?

Blocks 是 c 语言的扩充功能。用一句话表示:带有局部变量的匿名函数。(所谓匿名函数,就是不带名称的函数)

blocks语法

^retrunType(parameter){
    content...
}

与一般的 c 语言函数定义相比有两点不同:

    1. 没有函数名
  • 2.带有“^”
    因OS X,iOS的应用程序源代码中大量地使用Block,所以插入记号“^”易于查找。

returnType可以省略,此时变为

^(parameter){
     content...
}

如果表达式中没有return语句,使用void类型;如果表达式有多个return语句,所有的返回值类型必须相同。

参数也可以省略,如果你不需要参数的话;
此时语法为:

^{
   content...
}

Blocks类型变量

给Block赋值:

int (^block)(int) = ^(int count){ return count + 1;};

再看设置函数的返回值为Block变量:

int (^func())(int) {
     return ^(int count){ return count + 1;};
}

从上面两块代码可以看出,跟着 “^” 的名字后者函数名,表示了一个block。

当然还有更加清晰的表达:

typedef int (^block_t)(int);
block_t block = ^(int count) { return count + 1;};
block_t fun(){ return ^(int count) { return count + 1;};  }

最后补充一点:
这样使会发生编译错误的:

    const char text[] = "hello";
    void (^block)(void) = ^{
        printf("%c", text[4]);
    };

这样不会发生错误:

    const char *text = "hello";
    void (^block)(void) = ^{
        printf("%c", text[4]);
    };

这是因为在现在的Block中,不支持c 语言数组,不过可以使用指针代替;
这也说明了指针和数组是不一样的。

END

你可能感兴趣的:(iOS 与OS X高级编程和内存管理-Blocks(一))