按照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 "[email protected]?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
的第三個字段Block_private.h
應該是void (*copy)(void *dst, void *src)
,它是指向塊的類型編碼的const char *
。
我的問題是:塊描述符結構是什麼樣子的?我的Block_private.h
文件已棄用,因此Block_descriptor
的實現與我提供的不同?如果我的文件是正確的,爲什麼__block_descriptor_tmp
的第三個字段是const char *
,而不是void (*copy)(void *dst, void *src)
? (:對象& __block瓦爾實事求是地講)
如果它們存在,那麼你需要知道block->flags & BLOCK_HAS_COPY_DISPOSE
一切,如果塊有需要管理捕獲
哦,是的!因此,就我而言,可選的幫助器函數不存在,所以'__block_descriptor_tmp'的第三個字段對應於'struct Block_descriptor_1'的簽名字段,第四個字段是以NULL結尾的導入變量的結尾。由於沒有導入的變量,因此'__block_descriptor_tmp'的末尾只有一個NULL。我對嗎? – LuisABOL
第三個字段是簽名yes,但NULL字段用於垃圾回收元數據,它在現代運行時中未使用。捕獲的變量位於block_literal中,而不是描述符(描述符在塊的所有實例之間共享,而爲每個實例分配一個新文本) –
當然,哦。對不起,最後一部分。我瘋了!謝謝! – LuisABOL