Je lisais ceci: does dispatch_async copy internal blocksComment faire nil dispatch_async sur bloc
et je veux savoir comment obtenir l'envoi-async à zéro sur le bloc, il copié sur le tas pour que le bloc peut être des déchets collectés .
Ok, donc sur la pile locale, je crée mon bloc:
MyBlock aBlock = ^{
for (int i = 0; i < 10; i++) {
NSLog(@"holder is: %p, holder.block is %p", holder, holder.block);
sleep(1);
}
};
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, aBlock);
sleep(2); // give the queue some time to start executing the block
Le bloc continue d'exécuter simplement parce qu'il est le bloc sur le tas qui est copié par dispatch_async. C'est tout le comportement attendu. Donc, ma question est .... Y at-il un moyen de faire explicitement ce bloc sur le tas être détruit?
Ou la mémoire ARC gérera-t-elle ce bloc pour moi dès que le dispatch_async aura fini de s'exécuter, et personnellement je ne peux rien y faire?
Merci!
Le bloc est toujours en cours d'exécution. Vous ne pouvez pas le détruire pendant qu'il est en cours d'exécution, mais il sera détruit quand c'est fait. – Wain
alors quand le bloc dans la file d'attente est fini, ARC va le détruire correctement? Y at-il de toute façon je peux le détruire par programmation? – rtsao
Voulez-vous dire que vous voulez terminer la boucle plus tôt? – Wain