11
votes

Éviter la "capture de soi fortement dans ce bloc, est susceptible de conduire à un message de conserver"

Chaque fois que je dois utiliser un VaR ou une propriété global à l'intérieur d'un bloc comme celui-ci: xxx

Je dois réécrire ceci comme xxx < p> ou Xcode se plaindre "capturera fortement de soi dans ce bloc de conduire à un cycle de conserver ...

Il se plaint même de variables Bool?

redécrigeant tout avant un bloc semble être une solution boiteux.

est-ce la voie correctement? Existe-t-il d'une manière élégante?

Ce truc est laid. J'utilise Arc.


0 commentaires

3 Réponses :


21
votes

Le problème ne se produit que lorsque vous référencez auto de l'intérieur du bloc, explicitement ou implicitement. Il n'y a pas d'avertissement émis lors de l'accès aux variables globales.

Dans votre cas, vous avez probablement accédé à un ivar (booléen). L'accès à l'ivar utilise implicitement auto , c'est pourquoi le compilateur vous avertit (correctement) sur un cycle de conservation.

Le moyen courant de fixer le cycle de retenue est le suivant: xxx

... et oui, c'est un peu une partie laide de blocs.


3 commentaires

Homme, c'est laid comme l'enfer. Avoir à redéclairer tout ... merci.


@Markamery Oui, Clang attrape de plus en plus de problèmes. Et c'est correct, la durée de vie de l'objet enfermé doit être étendue au moins jusqu'à la fin du bloc. Édition ...


@Nikolairuhe "La durée de vie de l'objet enfermant doit être étendue au moins jusqu'à ce que le bloc finisse" - Nice, je n'ai pas fait remarquer d'abord une raison pour créer une référence forte à auto / Le code> dans le bloc serait préférable d'utiliser __ dangereux_unéré , mais cette phrase seule le rend incroyablement clair. Pourrait même être utile de comparer les deux approches de votre réponse, si vous le souhaitez.



4
votes

Utiliser __ peu sûr de typeof (auto) faible (auto) faible = auto;


1 commentaires

Je pense que vous ne pouvez pas utiliser __unsafe_unéré avec arc



0
votes

En plus de la réponse de @ Nikolairuhe, dans votre exemple lorsque vous déclarez les propriétés xxx

implique des références fortes , donc utilisez __ faible empêcher le cycle de conservation. Ensuite, vous pourriez vous demander pourquoi vous devez déclarer un __ FORT Référence à Soi faible dans le bloc, et c'est pour vous assurer qu'il ne soit pas libéré pendant la vie du bloc, sinon faible > ISITSAINT Casserait si auto a été libéré. ​​


0 commentaires