Rui*_*res 16 introspection block objective-c ios
我想知道两件事:
1-是否可以通过使用objective-c内省来了解块的返回类型.
例如:int (^CountBlock)(NSArray *array)
我想知道它将返回的类型int
.
第二个问题是:
2-我可以保留对通用块的引用吗?我的意思是,基本上我可以id myBlock
用这个答案做第一个问题.
我尝试了什么
这种东西是不可能的:
id aBlock = ^{
NSString * aString = @"OMG";
return aString;
};
aBlock();
Run Code Online (Sandbox Code Playgroud)
由于编译器发现它id aBlock
不是函数或函数指针.
god*_*el9 11
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];
}
Run Code Online (Sandbox Code Playgroud)
这真的不太理想,因为你只是得到@encode
了签名的字符串,如下所示:@"i16@?0@8"
.我很想知道某人是否有更好的方法.
2)你绝对可以在类型中输入块id
:
typedef void(^MyBlockType)(void);
id aBlock = ^ { };
((MyBlockType)aBlock)();
Run Code Online (Sandbox Code Playgroud)
当然,如果你转换为错误的块类型,你最终会得到未定义的行为.
归档时间: |
|
查看次数: |
2983 次 |
最近记录: |