根据该Block_private.h
文件,每当在 Objective-c 文件中声明一个块时,都会在目标文件中创建以下结构来表示它:
struct Block_descriptor {
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void *src);
void (*dispose)(void *);
};
struct Block_layout {
void *isa;
int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
/* Imported variables. */
};
但是,当我clang -S ...
从
int(^squared)(int) = ^(int i) {
return i*i;
};
我得到以下代表该块的代码段:
.type .L.str210,@object # @.str210
.L.str210:
.asciz "i12@?0i8"
.size .L.str210, 9
.type __block_descriptor_tmp,@object # @__block_descriptor_tmp
.section .rodata,"a",@progbits
.align 16
__block_descriptor_tmp:
.quad 0 # 0x0
.quad 32 # 0x20
.quad .L.str210
.quad 0
.size __block_descriptor_tmp, 32
.type __block_literal_global,@object # @__block_literal_global
.align 8
__block_literal_global:
.quad _NSConcreteGlobalBlock
.long 1342177280 # 0x50000000
.long 0 # 0x0
.quad __main_block_invoke
.quad __block_descriptor_tmp
.size __block_literal_global, 32
所以__block_literal_global
和__block_descriptor_tmp
分别是 aBlock_layout
和 a Block_descriptor
。但是,如您所见, 的第三个字段__block_descriptor_tmp
应该是 avoid (*copy)(void *dst, void *src)
按照Block_private.h
,是const char *
指向块的类型编码的 a。
我的问题是:块描述符结构到底是什么样的?我的Block_private.h
文件是否已弃用,因此Block_descriptor
目前的实现与我提出的不同?如果我的文件是正确的,为什么 a 的第三个字段__block_descriptor_tmp
不是const char *
a void (*copy)(void *dst, void *src)
?