2010-03-29 10 views
0

Je suis nouveau aux applications d'Iphone et j'essaye de construire une application basée par tab. Je tente d'avoir une table sur une image dans les deux onglets. Sur l'onglet avec une table de liens audio et l'autre onglet avec une table de liens vidéo.super erreur dealloc en utilisant plusieurs classes de vue de la table

Tout cela est allé nager, j'ai créé deux viewControllers pour les deux tables. Tout le code fonctionne très bien mis à part pour le faire fonctionner Je dois commenter le super dealloc dans le - (vide) dealloc {} dans le videoTableViewController pour le second onglet.

Si je ne je reçois le message d'erreur:

LIBÉRÉ (id): Message numberOfSectionsInTableView: envoyé à l'objet libéré

s'il vous plaît aider, je ne sais pas pourquoi il fait cela ...

Répondre

0

UITableViewController gère la gestion de la mémoire pour son propre objet tableView, de sorte que vous n'avez théoriquement pas à vous en préoccuper.

Comme Alex a dit, il est certainement mauvais de pas appel [super dealloc]; c'est une fuite de mémoire à laisser de côté. Pour résoudre ce problème, vous devez comprendre pourquoi votre vue de table vit plus longtemps que votre contrôleur de vue (c'est ce qui vous donne cette erreur FREED (id)). Une supposition est que vous quittez la vue dans la hiérarchie de vue mais libérez le contrôleur. Le comportement souhaité lorsque vous vous déplacez d'un contrôleur de vue à un autre est de supprimer l'ancienne vue de la hiérarchie de vue en appelant [oldView removeFromSuperview] et puis en relâchant le contrôleur de vue, si vous souhaitez le libérer du tout. La raison pour laquelle removeFromSuperview est important est que les superviews conservent toujours leurs sous-vues, donc cela pourrait expliquer pourquoi votre tableView est si morte. Si votre application ne consomme pas beaucoup de mémoire, il peut être plus simple de garder vos contrôleurs de vue alloués (pas de les libérer) - cela résoudrait votre problème, même si cela ne règle pas vraiment le problème que votre vue de table vit plus longtemps que prévu, ce qui peut être le symptôme d'un code inefficace qu'il serait bon de nettoyer.

+0

Bonjour chaps, merci pour l'aide jusqu'à présent. Vos réponses ont beaucoup de sens pour moi, mais je n'arrive toujours pas à le faire fonctionner. J'ai restructuré le projet pour tenter de résoudre mon problème. Actuellement, l'onglet charge un fichier audio.xib avec audioViewController et la même structure pour la vidéo. dans audioViewController.h ajouter un UITableView comme IBOutlet, par exemple @interface audioViewController: UIViewController { \t IBOutlet UITableView * audioTable; } – padatronic

+0

Puis, dans IB, j'ajoute une classe de auidoTableViewController à l'audio.xib et j'en supprime la table. Ajoutez une table à la vue dans IB et la liez à l'audioTable que j'ai créé dans audioViewController.h. Je lier la source de données et déléguer à l'audioTableViewController dans IB. Je ajoute ensuite à audioViewController.m - (void) viewDidUnload { \t // Libère toutes les sous-vues conservées de la vue principale. \t // par ex. self.myOutlet = nil; \t [audioTable removeFromSuperview]; } - (void) dealloc { \t [version d'audioTable]; \t [super dealloc]; } . – padatronic

+0

Je fais la même chose pour la vidéo et quand j'essaie de changer d'onglet, il y a des bails mais maintenant aucune erreur n'est enregistrée dans la console. Est-ce une façon correcte de structurer mon application et est-ce que j'essaie de libérer la vue audioTable au mauvais endroit? espérons que cela est clair, ayant un vrai faff avec cela. Vous ne savez pas comment détecter ce qui ne va pas – padatronic

1

Si vous n'appelez pas [super dealloc], votre objet ne sera pas désalloué et vous perdrez de la mémoire. Vous devez décommenter cet appel au [super dealloc]. L'exception que vous notez ci-dessus signifie qu'une vue de table tente toujours d'accéder à votre objet désalloué en tant que source de données. C'est le problème que vous devez résoudre. Vraisemblablement, la vue de table qui fait cet appel appartient au contrôleur de vue qui a été désalloué.

Si votre contrôleur de vue est pas une sous-classe de UITableViewController, alors vous aurez besoin de release la vue de la table de référence que vous tenez. S'il s'agit d'une sous-classe de UITableViewController, il doit y avoir un autre endroit où cette vue de table est retain ed où elle ne devrait pas l'être.

+0

Brillant oui convenu alex. J'ai donc un audio de classe uview avec une vue de table à l'intérieur contrôlé par une classe UITTableView audioTableViewController. La même configuration pour les vidéos. Je suppose donc que j'ai besoin de libérer la vue de la table que je référence je fais cela dans la méthode dealloc de l'audioTableViewController? merci – padatronic

+0

S'il ne s'agit pas d'une sous-classe de UITableViewController, alors oui, vous devez libérer la vue tabulaire.Si vous l'avez attribué (même en chargeant un NIB), vous êtes responsable de le libérer. – Alex