2010-03-24 8 views
0

Avertissement: Je suis plutôt novice en Objective-C et en modèle de conservation. J'ai développé dans un environnement .NET ramassé les ordures pour les cinq dernières années, donc j'ai été gâté. Je continue d'apprendre. Je suis en train de faire planter mon application iPhone avec EXC_BAD_ACCESS. Cela arrive dans une configuration de contrôleur de navigation/tableview. Quand je sélectionne une rangée la première fois, pas de problèmes. Il bascule dans le contrôleur enfant sans problèmes. Je reviens et sélectionne le même ligne encore. Le programme continue alors à se bloquer. Toutes les autres lignes fonctionnent bien, mais chaque deuxième fois une ligne est accédée, c'est un accident.L'application se bloque toutes les deux fois qu'une ligne vue de table est sélectionnée dans la configuration du contrôleur de navigation.

J'ai repéré l'emplacement où cela se produit. Le contrôleur enfant (qui est une classe que je réutilise pour chaque ligne du même type) qui est en cours de commutation a un tableau de NSString représentant les lignes qui seront affichées. Je l'ai mis avant de pousser le contrôleur de l'enfant. C'est là où cela se produit apparemment.

J'ai du mal à déboguer ce problème, en luttant toujours avec xcode et tout. Je crains qu'il y ait des informations vitales qui manquent ici, mais peut-être qu'il y a quelque chose que vous reconnaissez.

+0

Comment maintenez-vous le tableau dans le contrôleur de l'enfant? Est-ce par l'intermédiaire d'une propriété, et si c'est le cas, conservez, assignez ou copiez-vous? Aussi, je ne pense pas que cela doive être un wiki communautaire. –

+0

Désolé, je pensais que le wiki de la communauté signifiait autre chose que ce qu'il était. Le tableau de la propriété enfant est certainement une propriété et il est conservé. C'est pourquoi je n'ai pas compris en premier lieu. NSZombieEnabled (voir ci-dessous) m'a révélé qu'une méthode a été envoyée à une instance désallouée, donc je présume que j'ai publié bientôt. Je ne l'ai toujours pas cloué, cependant. – Thaurin

Répondre

2

Activer NSZombies.

http://www.cocoadev.com/index.pl?NSZombieEnabled

Cela vous aidera à identifier l'objet qui est trop libéré (probablement ce qui se passe).

+0

Mon application est toujours tombée en panne et est retournée au tremplin dans le simulateur. N'est-ce pas ce qui n'est pas supposé arriver avec cela activé? J'ai quand même obtenu une bonne ligne dans la console du débogueur, en me disant quelle méthode a été envoyée à l'instance désallouée (isEqualToString) – Thaurin

+0

Assurez-vous que vous exécutez debug et définissez un point d'arrêt sur "raise"." Dans la console (vous aurez envie de la fonction raise lorsque vous êtes invité): b raise – xyzzycoder

0

Alors ... [UINavigationController pushViewController] ne retient pas, n'est-ce pas? ;) Ce que j'ai fait était init/alloc le contrôleur qui allait être poussé sur la pile de navigation, le pousser et ensuite le relâcher. Je pensais que le contrôleur de navigation conserverait le contrôleur. Apparemment, ce n'était pas le cas. Il a évidemment travaillé la première fois qu'il a été poussé, mais pas la seconde. Je suppose que c'est là que le souvenir s'est vraiment libéré. Activation des zombies a révélé qu'il recevait des messages (de setters) à un objet désalloué. Pourquoi ai-je pensé que PushViewController conserverait le contrôleur? Je ne sais pas; Je pense que je suis confus en pensant que si vous l'avez alloué, vous êtes également responsable de la désaffectation. Je pensais d'une façon ou d'une autre que, après l'avoir poussé, ce serait la responsabilité du contrôleur de la navigation. Il semble que j'avais tort. J'apprends encore à avoir une idée de cela (le mauvais C# et la collecte des ordures m'ont fait peur!). Quelqu'un a-t-il quelque chose à ajouter?

Pour illustrer, cela semble avoir eu tort: ​​

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSUInteger section = [indexPath section]; 
NSUInteger row = [indexPath row]; 

if (selectionController == nil) 
{ 
    selectionController = 
    [[ConfigSelectionViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
} 

NSString *title = [self titleForSection:section row:row]; 
NSString *key = [self keyForSection:section row:row]; 

selectionController.configKey = key; 
selectionController.title = title; 

NSArray *listItems = [self itemsForSection:section row:row]; 
selectionController.list = listItems; 

[self.navigationController pushViewController:selectionController animated:YES]; 

     // DON'T DO THIS! 
     [selectionController release]; 


} 
+1

Ceci est incorrect UINavigationController ne conserve en poussant un nouveau contrôleur de vue Il y a un bug quelque part ailleurs dans votre code – Rengers

+0

Vous êtes..! Je l'ai découvert ce matin, je libérais un objet dans un tableau à l'aide d'un pointeur, alors que ce n'était pas du tout l'intention! Je pensais bêtement que le pointeur le retenait. Merci pour la confirmation, cependant. – Thaurin