Lui*_*BOL 5 compilation objective-c objective-c-blocks
根据该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. */
};
Run Code Online (Sandbox Code Playgroud)
但是,当我生成一个程序集文件时,with clang -S ...,from
int(^squared)(int) = ^(int i) {
return i*i;
};
Run Code Online (Sandbox Code Playgroud)
我得到代表块的以下代码段:
.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
Run Code Online (Sandbox Code Playgroud)
所以,__block_literal_global和__block_descriptor_tmp是Block_layout和Block_descriptor分别.但是,正如你所看到的,第三场__block_descriptor_tmp,这应该是一个void (*copy)(void *dst, void *src)根据Block_private.h,是一个const char *指向块的编码类型.
我的问题是:块描述符结构究竟是什么样的?我的Block_private.h文件是否已弃用,因此Block_descriptor目前的实现与我提供的实现不同?如果我的文件是正确的,为什么是第三场__block_descriptor_tmp一个const char *,而不是一个void (*copy)(void *dst, void *src)?
只有当块具有需要管理的捕获时,才包含复制和配置帮助程序(实际上说:objects&__block vars)
如果他们在场的话 block->flags & BLOCK_HAS_COPY_DISPOSE
您需要知道的一切内容如下:http://clang.llvm.org/docs/Block-ABI-Apple.html
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |