2013-02-04 29 views
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 "[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_layoutBlock_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

一切,如果塊有需要管理捕獲

回答

6

複製和處置傭工只包括在這裏列出:http://clang.llvm.org/docs/Block-ABI-Apple.html

+0

哦,是的!因此,就我而言,可選的幫助器函數不存在,所以'__block_descriptor_tmp'的第三個字段對應於'struct Block_descriptor_1'的簽名字段,第四個字段是以NULL結尾的導入變量的結尾。由於沒有導入的變量,因此'__block_descriptor_tmp'的末尾只有一個NULL。我對嗎? – LuisABOL

+0

第三個字段是簽名yes,但NULL字段用於垃圾回收元數據,它在現代運行時中未使用。捕獲的變量位於block_literal中,而不是描述符(描述符在塊的所有實例之間共享,而爲每個實例分配一個新文本) –

+0

當然,哦。對不起,最後一部分。我瘋了!謝謝! – LuisABOL

相關問題