L'Instance a été libérée, tandis que la valeur de la clé, les observateurs étaient encore inscrits
J'ai une UITableView.
Ici, je me suis différent de la cellule. Chaque cellule dispose d'un modèle. Avec KVO et NotificationCenter la cellule écouter le modèle pour les changements. Quand je quitte le ViewController, j'obtiens cette erreur:
An instance 0x109564200 of class Model was deallocated while key value observers were still registered with it.
Observation info was leaked, and may even become mistakenly attached to some other object.
Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x109429cc0> (
<NSKeyValueObservance 0x109429c50: Observer: 0x10942d1c0, Key path: name, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x10968fa00>
)
Dans la cellule-je faire lorsque le modèle de propriété est définie/modifié:
[_model addObserver:self
forKeyPath:@"name"
options:0
context:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(modelIsInvalid:)
name:@"modelIsInvalid"
object:_model];
Puis dans la cellule dealloc:
- (void)dealloc
{
NSLog(@"DEALLOC CELL");
[[NSNotificationCenter defaultCenter] removeObserver:self];
[_model removeObserver:self forKeyPath:@"name"];
}
Dans le modèle que j'ai également de vérifier quand elle est désalloué:
- (void)dealloc
{
NSLog(@"DEALLOC MODEL");
}
Toutes les cellules sont libérées avant de tous les modèles, mais toujours j'ai cette erreur. Aussi je ne suis pas sûr de savoir comment définir le point d'arrêt mentionné dans l'erreur.
OriginalL'auteur Johannes | 2014-07-31
Vous devez vous connecter pour publier un commentaire.
Ça ne marchera pas parce que les cellules sont réutilisées. Ainsi, lorsque la cellule sort de l'écran, il n'est pas libéré, il va à la réutilisation de la piscine.
De ne pas vous inscrire notifications et KVO dans la cellule. Vous devez le faire dans le table view controller au lieu et lorsque les changements de modèle, vous devriez mettre à jour le modèle et de le recharger les cellules visibles.
Je suis en désaccord sur "Vous ne devriez pas enregistrer les notifications et le KVO dans la cellule". Avec la bonne recette, c'est beaucoup plus pratique pour l'observer à partir de la cellule, et je le fais tout le temps sans problèmes. @Johannes a trouvé le bon chemin.
pouvez-vous démontrer la "bonne recette"? De préférence dans swift 😉
J'ai fait changé mon esprit, cette réponse est le chemin à parcourir. Laissez votre cellule observer son modèle si nécessaire, et à la vue de la table peut observer le modèle de changement. Dans un sens strict, KVO peut ne pas convenir à des cellules, de la délégation et des rappels est la meilleure.
génial merci pour la réponse rapide. Honnêtement si je suis assez nouveau sur iOS, et de ne pas totalement comprendre comment traduire ce code. Ma conjecture est dans le cellForRowAtIndexPath méthode dans le TableViewController-je ajouter un observateur à l'objet associé à cette cellule particulière. Est ce que le droit? et si oui, où puis-je supprimer l'observateur de l'objet?
OriginalL'auteur Greg
J'ai trouvé la réponse. Je ne peux pas effacer le sujet, quelqu'un a répondu 🙂 ce sera Peut-être utile pour quelqu'un.
Le problème est que la UITableView dequeue la même cellule utilisée avant, pour une ligne plus bas (qui devient visible lorsque le défilement assez loin).
Dans l'incubateur, j'ai maintenant:
OriginalL'auteur Johannes
Basé sur la accepté de répondre (ce qui est correct), vous pouvez le résoudre en supprimant l'observateur sur la "prepareForReuse" méthode de la cellule.
Cette méthode sera appelée avant réutilisation de la cellule de défilement etc.. donc vous n'aurez pas de problème.
OriginalL'auteur Emilio
Il peut y avoir une possibilité que votre vue-Contrôleur n'est pas l'appel de la méthode dealloc parce que c'est peut-être tenir par quelqu'un et votre dealloc méthode n'est pas appelée. Vous pouvez supprimer le statut d'observateur à votre
viewDidUnload:
ouviewWillDisappear:
méthode ou vous pouvez suivre votre contrôleur en instrument pour tout conserverOriginalL'auteur Retro
Le meilleur endroit pour ce faire, des Cellules et de la réutilisation des points de vue est en
willMove(toSuperiew)
override func willMove(toSuperview newSuperview: UIView?) {
if newSuperview == nil { //check for nil means this will be removed from superview
self.collectionView?.removeObserver(self, forKeyPath: "contentSize")
}
}
OriginalL'auteur Basheer_CAD