5

根据该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)

4

1 回答 1

7

仅当块具有需要管理的捕获时才包含复制和处置助手(实际上是:对象和 __block vars)

如果他们在场,那么block->flags & BLOCK_HAS_COPY_DISPOSE

您需要知道的一切都在这里概述:http: //clang.llvm.org/docs/Block-ABI-Apple.html

于 2013-02-04T02:09:57.003 回答