iOS阻止内省

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)

当然,如果你转换为错误的块类型,你最终会得到未定义的行为.