gpt4 book ai didi

objective-c - 为什么这个 block 在它的描述符中没有复制和处置指针?

转载 作者:太空狗 更新时间:2023-10-30 03:51:16 24 4
gpt4 key购买 nike

根据 Block_private.h 文件,每当在 Objective-c 文件中声明一个 block 时,都会在目标文件中创建以下结构来表示它:

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;
};

我得到以下代表 block 的片段:

    .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 分别是一个 Block_layout 和一个 Block_descriptor。但是,如您所见,__block_descriptor_tmp 的第三个字段,根据 应该是 void (*copy)(void *dst, void *src) Block_private.h,是一个指向 block 类型编码的const char *

我的问题是: block 描述符结构到底是什么样的?我的 Block_private.h 文件是否已弃用,因此 Block_descriptor 实现与我提供的不同?如果我的文件是正确的,为什么__block_descriptor_tmp的第三个字段是const char *,而不是void (*copy)(void *dst, void *src )?

最佳答案

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

如果它们存在,则 block->flags & BLOCK_HAS_COPY_DISPOSE

此处列出了您需要了解的所有内容:http://clang.llvm.org/docs/Block-ABI-Apple.html

关于objective-c - 为什么这个 block 在它的描述符中没有复制和处置指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14679511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com