Pendant des années, j'ai été à la suite d'un grand modèle appelé Cible-Action qui va comme ceci:
Un objet appelle un sélecteur de spécifié sur une cible précise de l'objet lorsque vient le temps de les appeler. Ceci est très utile dans beaucoup de cas différents où vous avez besoin d'un simple rappel à une méthode arbitraire.
Voici un exemple:
- (void)itemLoaded {
[specifiedReceiver performSelector:specifiedSelector];
}
En vertu de l'ARC, il s'avère maintenant que faire quelque chose comme cela tout d'un coup, est devenu dangereux.
Xcode lance un avertissement qui va comme ceci:
PerformSelector peut provoquer une fuite parce que son sélecteur est inconnu
Bien sûr, le sélecteur est inconnue, puisque dans le cadre de la Cible-Action modèle de conception, vous pouvez spécifier quel que soit le sélecteur vous voulez afin d'obtenir un appel lorsque quelque chose d'intéressant se passe.
Ce qui me dérange le plus à propos de cet avertissement, c'est qu'il dit qu'il y a peut être un risque de fuite de mémoire. De ma compréhension de l'ARC ne pas plier la gestion de la mémoire règles, mais plutôt simplement automatise l'insertion de conserver/presse/autorelease messages au bon endroit.
Une autre chose à noter ici: -performSelector: avoir un id
de la valeur de retour. ARC analyse les signatures de méthode pour comprendre, par l'application de conventions de nommage si la méthode renvoie un +1 conserver le comte objet ou pas. Dans ce cas, l'ARC ne sais pas si le sélecteur est un -newFooBar
usine ou tout simplement à l'appel d'une unsuspicious travailleur méthode (qui est presque toujours le cas avec Cible-Action de toute façon). En fait l'ARC doit avoir reconnu que je n'ai pas s'attendre à un retour de la valeur, et donc oublier tout le potentiel de +1 conserver compté valeur de retour. En regardant cela de ce point de vue, je peux voir où l'ARC est à venir à partir de, mais il ya encore trop d'incertitude sur ce que cela signifie réellement dans la pratique.
N'est que maintenant dire sous l'ARC de quelque chose peut aller mal, qui ne serait jamais arrivé sans l'ARC? Je ne vois pas comment cela pourrait entraîner une fuite de mémoire. Quelqu'un peut-il donner des exemples de situations dans lesquelles c'est dangereux de le faire, et comment exactement une fuite est créé dans ce cas?
J'ai vraiment googlé l'enfer hors de l'internet mais n'ai pas trouvé de site en expliquant pourquoi.