我正在挖掘块的真正含义,我发现在_Block_copy_internal()中,我们将_NSConcreteMallocBlock分配给result-> isa,但_NSConcreteMallocBlock是一个包含32个void *元素的数组,它让我困惑了为什么将_NSConcreteMallocBlock定义为数组指针?为什么dyld将_NSConcreteMallocBlock链接到NSMallocBlock类?
答案 0 :(得分:1)
将它声明为32个指针只是为后面放置的类对象的大小保留空间。
如果您阅读了https://opensource.apple.com/source/libclosure/libclosure-65/data.c
中的评论这些数据区域由Foundation设置为以真实类别链接 事后。
基金会是封闭源代码,因此您无法看到它是如何工作的以及它们为该空间添加了什么内容。
答案 1 :(得分:0)
___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);