访问块内的C数组块

时间:2017-07-27 14:21:20

标签: ios objective-c macos cocoa

我有一个像这样定义的C数组块:

void (^block1)() = ^void() {
  doSomething1();
  doSomething2();
};

void (^block2)() = ^void() {
  doSomething3();
  doSomething4();
};

// etc.
typedef void (^myBlockType)();
myBlockType arrayBlock[2];
arrayBlock[0] = block1;
arrayBlock[1] = block2;

然后我试图从块内部访问该C数组,如

void (^adjust)(int value) = ^void(int value) {
    myBlockType myBlock = arrayBlock[value];
};

和Xcode抱怨

  

不能在块

中引用数组类型的声明

如果这是一个像浮点数,整数等等的数组,那么this solution但是对于C数组的块如何做呢?

我可以吗

    myBlockType array = calloc(2, sizeof(myBlockType));

?这是正确的方法吗?在这种情况下,我如何初始化值?

1 个答案:

答案 0 :(得分:0)

好的,评论跟踪之后的一些指示,但是你需要学习并理解这里发生了什么

  

我可以吗

myBlockType array = calloc(2, sizeof(myBlockType));
  • 在C数组中,指针是紧密相关的。在C数组T x[n]中,名称x的类型为T * - 指针。使用指针操作(x[n]& *(x + n))将索引操作*定义为与+相同。因此,您可以将数组视为指针,将指针视为数组,例如你可以"索引"指针。
  • 正如您所发现的,您无法在块中捕获本地数组变量。
  • 可以捕获指针值变量您有责任确保指向的内容仍然有效。
  • 您的calloc想法是一种可能的解决方案,但是类型错误,array需要声明为指针。
  • 此外,如果您正在使用ARC(超过可能)并存储可保留对象类型的指针,例如对对象或块的引用,array的类型必须包含所有权限定符。您可能应该使用__strong所以您的"数组"拥有它引用的项目,就像NSArray一样。
  • 对于您calloc(或malloc )的任何内容,如果需要,您有责任致电free

了解这些子弹和你可能的解决方案(不止一个)就会失败。

HTH