Possible de passer [auto anyFunction] dans les blocs sans __objet faible (iOS 5 + ARC)
Est-il possible de passer [auto anyFunction] dans les blocs sans __faiblesse de l'objet de l'auto?
Comme un exemple de ceci est valable code dans le Cadre du Système:
[UIView animateWithDuration:0.8 animations:^{
//Do animationStuff
} completion:^(BOOL finished) {
[self anyFunction];
}];
Vous pouvez passer [self anyFunction]
dans la réalisation bloc sans avertissement. Mais si vous écrivez votre propre méthode de l'achèvement du bloc, l'avertissement suivant se produit: capture 'auto' fortement dans ce bloc est susceptible de conduire à un cycle de conserver.
Une solution de travail est assez simple (iOS 5 + ARC). Avant le bloc de déclarer:
__weak MyClass *weakSelf = self;
et à l'achèvement de bloc, vous devez appeler:
[weakSelf anyFunction];
Mais, pour en revenir à ma Question: Pourquoi il n'est pas nécessaire dans le Cadre du Système d'Api pour utiliser un __weak
objet et d'utiliser self
sans aucun avertissement. Et comment mettre en œuvre une méthode sans la nécessité d'un __weak
objet dans le bloc?
Vous remercie pour votre effort.
Vous devez vous connecter pour publier un commentaire.
Les blocs, ce qui jette de l'erreur où l'on capture les objets qui propre le bloc. Par exemple
ou
mais
Car un objet conserve ses blocs, et un bloc elle conserve des objets. Donc, dans ces deux cas, l'objet qui exécute le bloc possède le bloc, qui est également propriétaire de l'objet. Vous avez donc une boucle de conserver un cycle. ce qui signifie que la mémoire est une fuite.
Dans l'exemple que vous avez donné, - vous êtes en train de regarder un méthode de classe. Vous appelez le bloc sur un
UIView
de la classe, pas unUIView
objet. Une classe n'a pas de mémoire associé. Et vous êtes probablement à l'appel de cette fonction à partir d'un contrôleur, de sorte que leself
de référence est conservé par le bloc, mais il n'y a pas de boucle, parce que l'auto n'est pas en conservant le bloc.De la même manière que vous l'avez remarqué, pas tous les objets qui sont utilisés dans le bloc doivent être faiblement référencé - seulement ceux qui causent un cycle de conserver.
ivar
, donc vous devez utiliser un__weak
objet deself
. Mais quand je déclare l'objet dans la fonction où le bloc est utilisé,self
peut les passé sans__weak
objet d'eux-mêmes. Qui fait sens. Merci encore.Sur le code que j'ai besoin de compiler, potentiellement, avec ou sans ARC, ou avec ou sans les nouveaux compilateurs, je ne les suivants ... fonctionnellement c'est la même chose que ce que vous avez énumérées déjà, mais évite de l'__faibles et également d'éviter de conserver des cycles de publication:
__block
sémantique ont changé de conserver l'objet.)