2010-11-11 7 views
0

J'essaie de créer une application basée sur le projet exemple d'Apple TheElements, mais en utilisant des données de base pour le modèle. Dans les données de base j'ai 4 tables DB connexes. Dans l'interface utilisateur, j'ai plusieurs tablesView, chacune montrant des lignes d'une table de Db différente. Lorsque vous cliquez sur une ligne dans une tableView, les éléments descendent vers les éléments d'une table associée, affichés dans une autre TableView.iPhone iOS 4 Données de base - Signal reçu du programme: "EXC_BAD_ACCESS"

Tout fonctionne mais l'application se bloque de manière inattendue à des moments aléatoires avec l'erreur: Programme reçu le signal: "EXC_BAD_ACCESS". BTW cette erreur ne montre que dans la console lors du débogage sur le périphérique. Aucune erreur ne s'affiche lors du débogage sur le simulateur. Ce screen grab montre le contenu du débogueur après un plantage.

Je ne sais pas comment déchiffrer le débogueur. Tout ce que je peux voir est le crash semble provenir de la fonction main() et _PFManagedObjectReferenceQueue est également répertorié, ce qui conduit à deviner que je fais quelque chose de mal avec les données de base.

Pour mettre en œuvre Core Data J'ajoute ce qui suit à mon en-tête délégué App:

@private 
    NSManagedObjectContext *managedObjectContext_; 
    NSManagedObjectModel *managedObjectModel_; 
    NSPersistentStoreCoordinator *persistentStoreCoordinator_; 

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; 
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator 

et en ajoutant les méthodes par défaut d'Apple pour ces fichiers à la mise en œuvre App délégué.

Puis à mon tête protocole source de données J'ai ajouté:

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;` 

et mes fichiers d'en-tête Source de données sont les suivantes:

#import <UIKit/UIKit.h> 
#import <CoreData/CoreData.h> 
#import "TableViewDataSourceProtocol.h" 

@interface MatchesAllDataSource : NSObject <UITableViewDataSource,TableViewDataSource, NSFetchedResultsControllerDelegate> 
{ 
NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 
} 

@end 

Lorsqu'une cellule de table est cliqué je passe le selectedObject comme suit:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath 
{ 
// deselect the new row using animation 
    [tableView deselectRowAtIndexPath:newIndexPath animated:YES]; 

// get the element that is represented by the selected row. 
Match *selectedMatch = [dataSource objectForIndexPath:newIndexPath]; 

// create an AtomicElementViewController. This controller will display the full size tile for the element 
MatchViewController *matchController = [[MatchViewController alloc] init]; 

// set the element for the controller 
matchController.selectedMatch = selectedMatch; 

// push the element view controller onto the navigation stack to display it 
[[self navigationController] pushViewController:matchController animated:YES]; 
[matchController release]; 
}` 

Quelqu'un at-il une idée de ce qui pourrait causer mon accident? Quelqu'un peut-il me diriger dans la bonne direction pour chercher une réponse?
Existe-t-il un meilleur moyen d'implémenter des données de base avec plusieurs tablesViews? Est-ce que quelqu'un me pointera vers un bon exemple de données de base avec plusieurs tablesViews?

+2

Votre premier indice ici est la présence de 'objc_msgSend' dans la trace de la pile. 99,9% du temps, cela indique que vous envoyez un message à un objet désalloué. Vérifiez que les objets pertinents sont gérés correctement. Cela pourrait aider, en particulier le peu sur les zombies: http: //www.touch-code-magazine.com/how-to-debug-exc_bad_access/ – warrenm

+0

Je seconde cela et j'ajouterais aussi ce comme une autre ressource utile. – westsider

Répondre

0

J'ai eu ce problème aussi avec le code de Marcus parce que je changé le UITableViewController à un UIViewController régulier et j'ai oublié de mettre dans le titre. Voici son code d'origine:

- (id)initWithStyle:(UITableViewStyle)style { 
if (self = [super initWithStyle:style]) { 
    self.title = @"Australia"; 
} 
return self; 

}

Donc, si vous est arrivé d'avoir changé les choses assurez-vous que vous définissez le self.title quelque part si la coutume NSArray + performSelector peut le voir lorsque l'application est initialisation ... comme dans init.

0

Je l'ai eu il y a quelques jours. Dans mon cas, j'accédais à un objet qui avait déjà été désalloué.

+0

Aussi, je peux voir à partir de l'erreur que le problème est avec 'title', mais toutes mes vues ont des titres donc cela ne m'aide pas à réduire les choses :-( – mattvick

+0

BTW J'utilise SegmentedControlExample de Marcus Crafter: http: // redartisan.com/2010/6/27/ cruisegmented-control-view-switching-revisited, qui fait: 'self.segmentedControl = [[UISegmentedControl alloc] initWithItems: [viewControllers arrayByPerformingSelector: @selecteur (titre)]];' mais cela est appelé lors de l'initialisation du contrôleur segmenté et l'application a tendance à planter en revenant à travers la navigation, mais pas toujours ... – mattvick

+0

Aussi 'title' est un champ dans toutes mes tables de Db .. – mattvick

0

Aussi je passe l'objet managedObjectContext d'une vue à que l'utilisateur navigue vers le bas les vues NavigationController comme celui-ci:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath 
{ 
    matchSegmentedController.selectedMatch = selectedMatch; 
    matchSegmentedController.managedObjectContext = dataSource.managedObjectContext;