与_NSConcreteMallocBlock和NSMallocBlock的关系?

时间:2016-08-02 13:50:09

标签: objective-c objective-c-blocks

我正在挖掘块的真正含义,我发现在_Block_copy_internal()中,我们将_NSConcreteMallocBlock分配给result-> isa,但_NSConcreteMallocBlock是一个包含32个void *元素的数组,它让我困惑了为什么将_NSConcreteMallocBlock定义为数组指针?为什么dyld将_NSConcreteMallocBlock链接到NSMallocBlock类?

2 个答案:

答案 0 :(得分:1)

将它声明为32个指针只是为后面放置的类对象的大小保留空间。

如果您阅读了https://opensource.apple.com/source/libclosure/libclosure-65/data.c

中的评论
  

这些数据区域由Foundation设置为以真实类别链接   事后。

基金会是封闭源代码,因此您无法看到它是如何工作的以及它们为该空间添加了什么内容。

答案 1 :(得分:0)

谢谢,我通过反汇编CoreFoundation和Foundation Framework了解到这一点,找到了这段代码:

___CFMakeNSBlockClasses:

0000000000008029        leaq    0x4522b0(%rip), %rdi    ## literal pool for: “__NSStackBlock"
0000000000008030        callq   0x1d4858                ## symbol stub for: _objc_lookUpClass
0000000000008035        movq    0x46f07c(%rip), %rdx    ## literal pool symbol address: __NSConcreteStackBlock
000000000000803c        movq    %rdx, %rcx
000000000000803f        subq    $-0x80, %rcx
0000000000008043        leaq    0x4522a5(%rip), %rsi    ## literal pool for: "__NSStackBlock__"
000000000000804a        movq    %rax, %rdi 

这个汇编代码对应于这些OC代码:

Class __NSStackBlock = _objc_lookUpClass(“__NSStackBlock”);
objc_initializeClassPair_internal(__NSStackBlock, “__NSStackBlock__”, &__NSConcreteStackBlock, &__NSConcreteStackBlock+0x80);