iOS阻止内省

 老做梦不醒_780 发布于 2023-02-09 14:15

我想知道两件事:

1-是否可以通过使用objective-c内省来了解块的返回类型.

例如:int (^CountBlock)(NSArray *array)我想知道它将返回的类型int.

第二个问题是:

2-我可以保留对通用块的引用吗?我的意思是,基本上我可以id myBlock用这个答案做第一个问题.

我尝试了什么

这种东西是不可能的:

id aBlock = ^{

    NSString * aString = @"OMG";

    return aString;
};

aBlock();

由于编译器发现它id aBlock不是函数或函数指针.

1 个回答
  • 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)();
    

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

    2023-02-09 14:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有