Lio*_*Lio 4 objective-c objective-c-blocks
假设我有一个包含Blocks的数组,我需要声明所有这些都需要一定数量的参数.
有没有办法以编程方式找到它?
对于任何最新版本的Clang来说,这确实是可能的.
Apple ABI for Blocks是私有的,但也已发布.由于该文档告诉我们编译器将用于Block对象的布局,我们可以在头文件中复制该信息并使用它来访问Block的组件.
Mike Ash的MABlockForwarding项目就是这样做的(另见文章) - 此文件顶部的大部分内容都是来自ABI doc的复制粘贴.他创造的我们感兴趣的是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];
}
Run Code Online (Sandbox Code Playgroud)
将返回(对于拥有它的块(它们都使用最近的Clang)),一个描述块的返回和参数类型的类型编码字符串.从那里,您可以创建一个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];
Run Code Online (Sandbox Code Playgroud)
结果有3,因为它包含Block本身的隐藏参数(并且Blocks不使用隐藏_cmd参数,或者它将是4).
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |