ios Block引數和返回值型別獲取
阿新 • • 發佈:2021-10-14
原部落格: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 函式簽名的字串。