2017-05-25 4 views
0

j'essaie de résumer la majeure partie de mon activité async dans les opérations, et souvent je opérations de lancer d'autres opérations, etc ...Comment obtenir un référencement de façon fermetures rapides

Le problème que je suis face est que lorsque je fais référence à l'opération d'origine, elle peut être désaffectée avant que les opérations successives puissent se terminer. Les fermetures que j'utilise échouent si j'ai un weak self, weak me = self ou (désastreusement)unowned me = self en place; mais si j'utilise self sans eux, aucun op désaffecte (fuite de mémoire).

Est-il possible de conserver une référence en vie à l'intérieur d'une fermeture, sans créer une situation de référence circulaire bidirectionnelle?

Répondre

0

Tout d'abord, vous devrez vous demander si votre self sera nul à l'avenir ou non. Si oui, alors weak et unowned entre en photo.

La méthode la plus sûre est d'utiliser weak puis de vérifier si elle a été désallouée ou non.

your-closure { [weak self] in 
     guard let strongSelf = self else { 
      print("self is been deallocated") 
      return 
     } 
    } 

Lorsque la fermeture fonctionne en cas ci-dessus, il ne capturera weak self. Au moment où la fermeture démarre, weak self est soit self, soit il est nul. Vous pouvez tester pour voir si strongSelf est défini ou non.

Si weak self est égal à self, alors strongSelf le conserve et il reste conservé jusqu'à ce que la fermeture soit rétablie lorsqu'elle est libérée. C'est tout ou rien.

+0

Je comprends cela. Ma question concerne la partie «si non» de votre réponse. Que faire si j'essaie d'empêcher le soi d'être nul dans le futur sans l'allouer définitivement en mémoire? Parce que j'utilise des ops, ils vont se terminer et se terminer à moins que je crée un lien perm, mais je demande s'il existe un moyen d'éviter cela. –

+0

Je veux que l'opération d'origine se répète jusqu'à ce que j'en aie fini, puis pouvoir la relâcher. –

+0

@JamesLingo Dans ce cas, vous devrez garder «opération» en utilisant un fort moi. Il n'y a pas d'autre choix ici. La seule chose qui se passera est la vie de soi sera prolongée dans ce cas jusqu'à ce que le bloc se termine. Notez également que le bloc est finalement exécuté, peu importe si le 'Self 'est encore en vie ou a été désalloué entre-temps. – Rahul