为什么这个Block没有在其描述符中复制和处理指针?

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_tmpBlock_layoutBlock_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)

Fjö*_*nir 6

只有当块具有需要管理的捕获时,才包含复制和配置帮助程序(实际上说:objects&__block vars)

如果他们在场的话 block->flags & BLOCK_HAS_COPY_DISPOSE

您需要知道的一切内容如下:http://clang.llvm.org/docs/Block-ABI-Apple.html