不兼容的块类型分配

时间:2014-02-19 18:45:28

标签: ios objective-c-blocks

我曾经使用了几次块,但从来没有先声明过typedef。

我正在尝试在类上设置这个定义(我们称之为ClassA)

typedef void (^myBlock)();

@property (nonatomic, copy) myBlock onCompletion;

然后我创建了这个类所代表的对象的实例并执行此操作:

ClassA *obj = [[ClassA alloc] init];
obj.onCompletion = ^(){
   // my code here
};

它抱怨“不兼容的块指针类型分配”......

你能解释一下吗?

4 个答案:

答案 0 :(得分:1)

虽然您不必指定块的返回类型,但如果您的块不带任何参数,则必须指定 void

答案 1 :(得分:1)

查看此链接以获取区块参考:block syntax

猜测可能是因为你把块参数类型留空了。

typedef void (^myBlock)(void); //Untested

答案 2 :(得分:0)

声明的块类型myBlock和块文字的类型的唯一区别可能是是返回类型。

如果将返回类型保留在块文字中,编译器会自动将其计算出来:

myBlock block1 = ^() { // everything is fine
   return;
};

myBlock block2 = ^() { // does not work, types differ
   return 1;
};

答案 3 :(得分:0)

根据OP的要求,我发布原始评论作为答案,即使有其他答案说明同样的事情:

您需要明确指定该块不带参数。你的typedef应该是:

typedef void (^myBlock)(void);