Block中为什么无法引用c语言数组

时间:2020-04-13 10:44:04   收藏:0   阅读:118

更新记录

时间 版本修改
2020年4月12日 初版

Block引用C语言数组报错

char text[] = "hello";
void (^blk)(void) = ^{
        printf("%c\n",text[2]);
};
char text[] = "hello";
int main(int argc, const char * argv[]) {
   void (^blk)(void) = ^{
        printf("%c\n",text[2]);
    };
    return 0;
}

报错的根本原因

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  const char *fmt;
  int val;              //block捕获的变量 val
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, const char *_fmt, int _val, int flags=0) : fmt(_fmt), val(_val) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  const char *fmt;
  int val;              //block捕获的变量 val
  char szArray[10];
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, const char *_fmt, int _val, char _szArray[10], int flags=0) : fmt(_fmt), val(_val), szArray[10](_szArray) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

捕获指针替代捕获C语言数组

struct __block_impl {
    void *isa;
    int Flags;
    int Reserved;
    void *FuncPtr;
};
struct __main_block_impl_0 {
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;
    char *text;
    __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, char *_text, int flags=0) : text(_text) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
    }
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
    char *text = __cself->text; // bound by copy

    printf("%c\n",text[2]);
    
}

static struct __main_block_desc_0 {
    size_t reserved;
    size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};

int main(int argc, const char * argv[]) {
    char text[] = "hello";
    __main_block_impl_0 block_struct = __main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, text);
    void (*blk)() = (void (*)())&block_struct;
    ((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
    return 0;
}

阅读延申

char text[] = "hello";
int main(int argc, const char * argv[]) {
   void (^blk)(void) = ^{
        printf("%c\n",text[2]);
    };
    return 0;
}
struct __main_block_impl_0 {
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;

    //如果block截获了自动变量,会放置在这里。由于该block内引用的是全局变量,并不会在此加入字段进行初始化。

    __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, char *_text, int flags=0) : text(_text) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
    }
};

参考资料

原文:https://www.cnblogs.com/HelloGreen/p/12688875.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!