Pourquoi l'analyseur statique ne détecte-t-il pas les références circulaires avec des blocs? Je me souviens que cela avait l'habitude de le faire quand j'avais retenu mes délégués au lieu de les assigner, avant l'introduction des blocs. Je me souviens des jolies petites lignes qu'il dessinait sur mon code (je pense ...)Références circulaires en Objective-C et clang
Si je fais cela, sans utiliser weakSelf, je sais que je vais obtenir une référence circulaire.
// Note 1: myObject is 'retained' by self.
// Note 2: myObject retains the block for the future
[self.myObject registerBlockOfCodeForFutureExectution:^{
[self doSomething];
}];
Sample Project Exploiting Issue
Maintenant, si je sais, et je suis un homme stupide, alors pourquoi ne sait pas mon ordinateur intelligente ce qui est mauvais et me prévenir que je suis stupide?
Il doit y avoir une raison logique pour laquelle il ne peut pas le détecter, et je veux savoir quelle est cette raison.
Cette question concerne l'analyse statique et statique, ne suggérez pas comment je répare les références circulaires - je sais comment faire.
Il se peut qu'il ne crée pas de cycle de rétention, le bloc conserve-t-il automatiquement le bloc? Ça ne ressemble pas à ça. – zaph
* "Je sais que je vais obtenir une référence circulaire" * - mauvaise hypothèse. – rmaddy
Dans ce cas le bloc est en ligne, seul le scope tient le bloc, il n'y a pas de cycle de rétention. Un test simple consiste à placer un NSLog() dans une méthode dealloc dans la classe et à voir qu'il est appelé lorsque l'instance de la classe perd sa valeur. – zaph