gpt4 book ai didi

objective-c - 找出一个 block 需要多少个参数

转载 作者:太空狗 更新时间:2023-10-30 04:00:23 24 4
gpt4 key购买 nike

假设我有一个包含 block 的数组,我需要断言所有 block 都需要给定数量的参数。

有没有办法以编程方式找出这个问题?

最佳答案

对于任何最新版本的 Clang,这确实是可能的。

Apple ABI for Blocks 是私有(private)的,但也是 published .由于该文档告诉我们编译器将用于 Block 对象的布局,我们可以在头文件中复制该信息并使用它来访问 Block 的组件。

麦克阿什的 MABlockForwarding project就是这样做的(另请参阅 article )——此文件顶部的大部分内容都是 ABI 文档的复制粘贴。我们感兴趣的是他创建的 BlockSig() 函数:

static const char *BlockSig(id blockObj)
{
struct Block *block = (__bridge void *)blockObj;
struct BlockDescriptor *descriptor = block->descriptor;

assert(block->flags & BLOCK_HAS_SIGNATURE);

int index = 0;
if(block->flags & BLOCK_HAS_COPY_DISPOSE)
index += 2;

return descriptor->rest[index];
}

这将返回(对于拥有它的 block (它们都用最近的 Clang 做的)),一个 type encoding string描述 block 的返回和参数类型。从那里,您可以创建一个 NSMethodSignature 对象,并向它询问它的 numberOfArguments:

 NSString * (^block)(int, NSArray *) = ^NSString * (int i, NSArray * a){
return @"Oh, yeah!";
};
const char * types = BlockSig(block);
NSMethodSignature * sig = [NSMethodSignature signatureWithObjCTypes:types];
[sig numberOfArguments];

结果是 3,因为它包含一个 Block 本身的隐藏参数(并且 Block 不使用隐藏的 _cmd 参数,否则它将是 4)。

关于objective-c - 找出一个 block 需要多少个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561813/

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