Ios 不兼容的块类型分配

Ios 不兼容的块类型分配,ios,objective-c-blocks,Ios,Objective C Blocks,我已经使用过几次块,但从来没有先声明typedef 我试图在一个类上设置这个定义(我们称之为ClassA) 然后我创建该类表示的对象的实例并执行以下操作: ClassA *obj = [[ClassA alloc] init]; obj.onCompletion = ^(){ // my code here }; 它抱怨“不兼容的块指针类型分配” 你们能解释一下吗 尽管您不必指定块的返回类型,但如果块不采用任何参数,则必须指定void 声明的块类型myBlock与块文本类型的唯一区别可能

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

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

然后我创建该类表示的对象的实例并执行以下操作:

ClassA *obj = [[ClassA alloc] init];
obj.onCompletion = ^(){
   // my code here
};
它抱怨“不兼容的块指针类型分配”


你们能解释一下吗

尽管您不必指定块的返回类型,但如果块不采用任何参数,则必须指定
void

声明的块类型
myBlock
与块文本类型的唯一区别可能是返回类型

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

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

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

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

只是猜测这可能是因为您将块参数类型留空了

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

在OP的要求下,我发布了我的原始评论作为答案,尽管还有其他答案说明了同样的事情:

您需要明确指定块不接受任何参数。您的typedef应该是:

typedef void (^myBlock)(void);

“//my code here”是否包含返回语句?如果您返回任何内容,它将更改块类型;尝试将typedef更改为
typedef void(^myBlock)(void)
@NikolaiRuhe,如果它只是
返回没关系。@rmaddy这就是我说的“任何事”的意思,但你是对的,不清楚。那么:您的代码是否包含带值的return语句?除了return类型之外,这两种块类型都是相同的,应该匹配。我认为如果将其留空,它将是无效的,但我错了。谢谢。我不确定,但我认为当你用空括号(而不是显式的
void
)声明一个块或函数时,编译器会假定一个
int
参数。@DesprateDeveloper你确定这是问题的完整答案吗。对我来说,只要块不返回任何东西,你发布的代码就可以正常工作。@rmaddy C标准说,没有显式参数的函数会接受未指定数量的参数。编译器不会检查它们。@NikolaiRuhe我知道我对那个细节不清楚。无论哪种方式,它都不同于无参数。这里有一个对每个人都非常有用的东西。。
typedef void (^myBlock)(void);