1. 程式人生 > 其它 >ios Block引數和返回值型別獲取

ios Block引數和返回值型別獲取

原部落格:http://www.swiftyper.com/2016/12/16/debuging-objective-c-blocks-in-lldb/

Block 的記憶體結構

在 LLVM 文件中,可以看到Block 的實現規範,其中最關鍵的地方是對於 Block 記憶體結構的定義:

struct Block_literal_1 {
    void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock
    int flags;
    int reserved;
    void (*invoke)(void
*, ...); struct Block_descriptor_1 { unsigned long int reserved; // NULL unsigned long int size; // sizeof(struct Block_literal_1) // optional helper functions void (*copy_helper)(void *dst, void *src); // IFF (1<<25) void (*dispose_helper)(void
*src); // IFF (1<<25) // required ABI.2010.3.16 const char *signature; // IFF (1<<30) } *descriptor; // imported variables };

可以看到第一個成員是isa,說明了 Block 在 Objective-C 當中也是一個物件。我們重點要關注的就是void (*invode)(void *, ...);和 descriptor 中的const char *signature

,前者指向了 Block 具體實現的地址,後者是表示 Block 函式簽名的字串

本文章僅供學習參考,如有版權侵犯,請聯絡作者修改,轉載請註明出處!