2016-08-02 1 views
0

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?

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);