美文网首页
iOS 与OS X高级编程和内存管理-Blocks(一)

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

作者: 永远保持一颗进取心 | 来源:发表于2016-05-29 16:37 被阅读28次

    前言:

    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(一)

          本文链接:https://www.haomeiwen.com/subject/undqdttx.html