前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Block_layout结构获取Block方法签名利用Block_layout结构获取Block方法签名

利用Block_layout结构获取Block方法签名利用Block_layout结构获取Block方法签名

作者头像
用户8893176
发布2021-08-09 11:09:25
8000
发布2021-08-09 11:09:25
举报
文章被收录于专栏:小黑娃Henry

废话不多说直接上代码:

代码语言:javascript
复制
#define BLOCK_DESCRIPTOR_1 1
struct HR_Block_descriptor_1 {
    uintptr_t reserved;
    uintptr_t size;
};

#define BLOCK_DESCRIPTOR_2 1
struct HR_Block_descriptor_2 {
    // requires BLOCK_HAS_COPY_DISPOSE
    HR_BlockCopyFunction copy;
    HR_BlockDisposeFunction dispose;
};

#define BLOCK_DESCRIPTOR_3 1
struct HR_Block_descriptor_3 {
    // requires BLOCK_HAS_SIGNATURE
    const char *signature;
    const char *layout;     // contents depend on BLOCK_HAS_EXTENDED_LAYOUT
};

struct HR_Block_layout {
    void *isa;
    volatile int32_t flags; // contains ref count
    int32_t reserved;
    HR_BlockInvokeFunction invoke;
    struct Block_descriptor_1 *descriptor;
};

enum {
    BLOCK_DEALLOCATING =      (0x0001),  // runtime
    BLOCK_REFCOUNT_MASK =     (0xfffe),  // runtime
    BLOCK_NEEDS_FREE =        (1 << 24), // runtime
    BLOCK_HAS_COPY_DISPOSE =  (1 << 25), // compiler
    BLOCK_HAS_CTOR =          (1 << 26), // compiler: helpers have C++ code
    BLOCK_IS_GC =             (1 << 27), // runtime
    BLOCK_IS_GLOBAL =         (1 << 28), // compiler
    BLOCK_USE_STRET =         (1 << 29), // compiler: undefined if !BLOCK_HAS_SIGNATURE
    BLOCK_HAS_SIGNATURE  =    (1 << 30), // compiler
    BLOCK_HAS_EXTENDED_LAYOUT=(1 << 31)  // compiler
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSString *str = @"123";
        void (^mallocBlock)(void) = ^void {
            NSLog(@"HR_Block - %@",str);
        };
        
        struct HR_Block_layout *bl = (__bridge struct HR_Block_layout *)mallocBlock;
        NSLog(@"Block isa: %@", bl->isa);
        
        void *descriptor = bl->descriptor;
        if(bl->flags & BLOCK_HAS_SIGNATURE){
            // HR_Block_descriptor_1
            descriptor += sizeof(struct HR_Block_descriptor_1);
            // HR_Block_descriptor_2
            if(bl->flags & BLOCK_HAS_COPY_DISPOSE){
                descriptor += sizeof(struct HR_Block_descriptor_2);
            }
            const char *signature = ((struct HR_Block_descriptor_3 *)descriptor)->signature;
            NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:signature];
            NSLog(@"%s",signature);
            NSLog(@"%@",methodSignature.debugDescription);
        }
        mallocBlock();
    }
    return 0;
}

输出:

有这段代码就可以随意玩耍了,做各种尝试:

源码下载

github

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/7/7 下午,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 废话不多说直接上代码:
    • 有这段代码就可以随意玩耍了,做各种尝试:
    • 源码下载
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档