J'ai deux contrôleurs tableview montrant des objets CoreData. L'un est une vue de détail (avec des phrases) on est un aperçu (avec des histoires). Choisissez une histoire -> Voir les phrases.Pourquoi n'ai-je pas besoin de publier managedObjectContext dans le 2nd TableViewController?
Il semble que j'étais en train de relâcher mon managedObjectContext; Je l'ai d'abord publié dans TableViewControllers dans dealloc et j'ai eu un plantage toutes les trois fois entre les deux contrôleurs (Histoire -> Phrase -> Histoire -> Phrase -> Histoire -> Crash). Certains débogage montré que je plantait dans mon délégué App après ce code dans viewDidLoad des deux TableViewControllers:
if (managedObjectContext == nil)
{
managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}
plus de recherche a trouvé this discussion ce qui m'a amené à croire qu'il était un cas d'un plus publié ManagedObjectContext:
Le deuxième problème plus prosaïque est simplement un NSManagedObject surchargé. Instruments ObjectAlloc outil devrait être en mesure d'aider vous.
J'ai donc supprimé [version de managedObjectContext]; de mon dealloc dans TableViewController et maintenant je n'ai pas de fuites (selon Instruments) et pas de crash.
Il semble que le problème est résolu, mais voici la question:
je pourrais être tout à fait le point manquant, et juste cacher une autre question. Comment puis-je trouver la sur-version, ou le vrai problème?
Si j'ai résolu le problème, je voudrais savoir pourquoi il est fixé et pourquoi je ne ai pas besoin de libérer le MOC dans le deuxième TableViewController
MakeSentenceTableViewController.m
@implementation MakeSentenceTableViewController
@synthesize story, managedObjectContext;
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"My Story";
NSLog(@"Passed Story Object: %@", story);
if (managedObjectContext == nil)
{
NSLog(@"managedObjectContext == nil");
managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}else{
NSLog(@"managedObjectContext != nil");
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentence" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
//sorting stuff:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order" ascending: YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
//[request setFetchBatchSize:FETCH_BATCH_SIZE];
[sortDescriptors release];
[sortDescriptor release];
fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request managedObjectContext:managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
[request release];
NSError *error;
[fetchedResultsController performFetch:&error];
NSLog(@"FetchedResultsController: %@", fetchedResultsController);
NSLog(@"fetchedResultsController RetainCount at viewDidLoad: %d", [fetchedResultsController retainCount]);
}
//snip...table view bits
- (void)dealloc {
[fetchedResultsController release];
//Why don't I have to release this?
//[managedObjectContext release];
[super dealloc];
}
Brillant, merci pour la réponse rapide et utile. – glenstorey