我想知道两件事:
1-是否可以通过使用objective-c内省来了解块的返回类型.
例如:int (^CountBlock)(NSArray *array)
我想知道它将返回的类型int
.
第二个问题是:
2-我可以保留对通用块的引用吗?我的意思是,基本上我可以id myBlock
用这个答案做第一个问题.
我尝试了什么
这种东西是不可能的:
id aBlock = ^{ NSString * aString = @"OMG"; return aString; }; aBlock();
由于编译器发现它id aBlock
不是函数或函数指针.
1)这个答案讨论了如何获取块的签名.这是相关的代码:
static const char *BlockSig(id blockObj) { struct Block *block = (void *)blockObj; struct BlockDescriptor *descriptor = block->descriptor; int copyDisposeFlag = 1 << 25; int signatureFlag = 1 << 30; assert(block->flags & signatureFlag); int index = 0; if(block->flags & copyDisposeFlag) index += 2; return descriptor->rest[index]; }
这真的不太理想,因为你只是得到@encode
了签名的字符串,如下所示:@"i16@?0@8"
.我很想知道某人是否有更好的方法.
2)你绝对可以在类型中输入块id
:
typedef void(^MyBlockType)(void); id aBlock = ^ { }; ((MyBlockType)aBlock)();
当然,如果你转换为错误的块类型,你最终会得到未定义的行为.