gpt4 book ai didi

objective-c - 传递与签名不匹配的 block 参数

转载 作者:太空狗 更新时间:2023-10-30 03:31:14 26 4
gpt4 key购买 nike

我在使用基于 block 的 API 时偶然发现了一个场景,在该场景中我传递了一个 block 参数,该参数的签名与方法期望的 typedef 参数不匹配。令我惊讶的是,编译器似乎并不关心这个,应用程序也没有崩溃。这是预期的行为吗?示例:

typedef void(^MyBlock)();
typedef void(^MyBlockWithParam)(id param);

- (void)doWork {
MyBlockWithParam block1 = ^(id param) {
NSLog(@"block1: %@", param);
};

MyBlock block2 = ^{
NSLog(@"block2");
};

[self loadData:block1];
[self loadData:block2];
}

- (void)loadData:(MyBlockWithParam)block {
block(@"foo");
}

最佳答案

提供空参数说明

typedef void(^MyBlock)();

表示“未指定”参数。所以这两种类型是兼容的。将第一个声明更改为

typedef void(^MyBlock)(void);

指定该 block 不带任何参数,您将收到错误消息。

K&R C 指定空参数列表表示“未指定”。 C block 规范说这对于 block 类型声明不正确(参见 http://clang.llvm.org/docs/BlockLanguageSpec.html#block-variable-declarations)但是:GCC 和 Clang 都将 K&R 行为实现为语言扩展。

关于objective-c - 传递与签名不匹配的 block 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18151993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com