Je cherchais vraiment ce qu'est un bloc, je trouve que dans _Block_copy_internal(), nous assignons _NSConcreteMallocBlock au résultat-> isa, mais _NSConcreteMallocBlock est un tableau avec 32 count void * elements, cela me confond beaucoup, pourquoi définir _NSConcreteMallocBlock à un pointeur de tableau? et comment le dyld lier le _NSConcreteMallocBlock à la classe NSMallocBlock?La relation avec _NSConcreteMallocBlock et NSMallocBlock?
0
A
Répondre
1
La déclaration en tant que 32 pointeurs réserve simplement de l'espace pour la taille de l'objet de classe qu'ils mettront plus tard.
Si vous lisez le commentaire dans https://opensource.apple.com/source/libclosure/libclosure-65/data.c
Ces zones de données sont mis en place par la Fondation pour relier en tant que classes réelles a posteriori.
Fondation est source fermée de sorte que vous ne pouvez pas voir comment cela fonctionne et quel contenu ils ont mis dans cet espace.
0
merci, je l'ont compris en démontant cadre CoreFoundation Fondation, a trouvé ce code:
___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
ce montage code correspondant à ces codes d'OC:
Class __NSStackBlock = _objc_lookUpClass(“__NSStackBlock”);
objc_initializeClassPair_internal(__NSStackBlock, “__NSStackBlock__”, &__NSConcreteStackBlock, &__NSConcreteStackBlock+0x80);