2010-09-12 10 views
6

Gelegenheitsleser und zum ersten Mal Frage Fragesteller, so wenden Sie sich bitte :)Odd Core Data Fehler durch Überlösen verursacht?

Ich erstelle ein Managed Object (Account) sanft, ist, dass in ein Kind-View-Controller wird geleitet, wo seine in einer Eigenschaft festgelegt wird, die ist beibehalten.

Account * account = [[Account alloc] initWithEntity:entity insertIntoManagedObjectContext:context]; 
AddAccountViewController *childController = [[AddAccountViewController alloc] init]; 
childController.title = @"Account Details"; 
childController.anAccount = account; 
childController.delegate = self; 

[self.navigationController pushViewController:childController animated:YES]; 
[childController release]; 
[account release]; 

Die View-Controller-Schnittstelle:

@interface AddAccountViewController : UIViewController { 
} 

@property (nonatomic, retain) IBOutlet UITextField * usernameTextField; 
@property (nonatomic, retain) IBOutlet UITextField * passwordTextField; 

@property (nonatomic, retain) Account * anAccount; 
@property (nonatomic, assign) id <AddAccountDelegate> delegate; 

- (IBAction)cancel:(id)sender; 
- (IBAction)add:(id)sender; 
- (IBAction)textFieldDone:(id)sender; 
@end 

So in Codebeispiel 1 I das Konto Objekt freigegeben habe, weil ich nicht mehr interessiert bin in es in diesem Verfahren. Wie es von der AddAccountViewController beibehalten wird, habe ich einen Eintrag in AddAccountViewControllerdealloc, die es freigibt.

aber wenn ich das Objekt aus dem ManagedObjectContext den App-Abstürzen mit den folgenden (eher unklar) Fehlern zu löschen:

Detected an attempt to call a symbol in system libraries that is not present on the iPhone: 
_Unwind_Resume called from function _PFFaultHandlerLookupRow in image CoreData. 

Nach vielen Debuggen & Haaren ziehen ich entdecken, wenn ich nicht Release-Konto in AddAccountViewControllerdealloc Methode die App funktioniert ordnungsgemäß kontinuierlich und scheint nicht zu lecken nach Instrumenten.

Kann jemand Licht über das Geschehen werfen? Aus den Dokumenten über Eigenschaften geht hervor, dass diese beibehalten werden müssen. Was habe ich verpasst?

aktualisieren Kevins Frage zu beantworten

Der Code des Objekts aus dem ManagedObjectContext ist in der RootViewController (das Halten des Kindes Controller)

// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the managed object for the given index path 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 

     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 

     // Save the context. 
     NSError *error = nil; 
     if (![context save:&error]) { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 
+0

Können Sie den Code zeigen, dass sie von der NSManagedObjectContext löscht? Und geschieht dies innerhalb von AddAccountViewController oder anderswo? –

+0

'childController.anAccount = account;' In dieser Zeile wird 'account' nicht gespeichert. Es kopiert es in "anAccount". Dies wird nicht beibehalten, und Sie müssen nur 'anAccount' in der Dealloc-Methode' AddAccountViewcontroller' freigeben. –

+0

@Thomas: '@property (nonatomic, behalten) Konto * anAccount;' Warum würde es nicht beibehalten? – Pyetras

Antwort

1

Zunächst zu löschen: Es klingt wie ein Fehler von Apple. Core Data ruft _Unwind_Resume auf, was (wahrscheinlich) eine Art Ausnahme ist. Exception-Unwinding existiert auf dem Telefon, aber (denke ich) verwendet die ARM ABI, die Funktionsnamen beginnend mit __cxa_ verwendet. Läufst du auf dem Simulator? Welche Version des SDK?

Möglicherweise gibt es eine zusätzliche Version, die irgendwo herumschwebt, die "ausgeglichen" ist, wenn Sie den Anruf zu [account release]; entfernen.

"Instrumente zeigen keine Lecks" bedeutet nicht, dass es keine gibt; zuletzt habe ich überprüft, dass es durch Zyklen verwirrt wurde (d. h. es würde kein Leck anzeigen, wenn Sie vergessen hätten, IBOutlets in dealloc zu setzen). Ich habe mit NSMutableData * d = [NSMutableData dataWithLength:1<<20]; memcpy(d.mutableBytes, &d, 4); getestet, aber ein einfacher Test ist nur [[UIView alloc] initWithFrame:CGRectZero].

Wenn Sie denken, dass es sich um ein Retain-/Release-Problem handelt, habe ich diese Probleme durch Überschreiben von Retain/Release/Autorelease zum Aufruf von NSLog behoben. Ich fügte dann Haltepunkte für alle hinzu, legte sie auf den Befehl "bt" fest und klickte auf die Auto-Fortsetzung. Dann führe das Ding aus, das kaputt geht (in meinem Fall denke ich, dass es nur ein Extra war), drucke den Log-Output aus, klebe ihn auf ein Whiteboard und verbringe eine halbe Stunde damit, zu behalten und zu veröffentlichen.

+1

Das Entfernen der '[account release];' am Ende des ersten Blocks bedeutet, dass 'retain' &' release' in 'AddAccountViewController' korrekt ausgeglichen sind und die App beim Speichern nach dem Entfernen eines Eintrags aus dem' 'nicht abstürzt ManagedObjectContext'. Bezüglich des ersten Teils habe ich den Code sowohl auf dem Simulator als auch auf dem Gerät ausgeführt und diesen Fehler erhalten. Das SDK war 4.1 GM. – tarasis

+0

Wenn '' [account release]; '', wie beschrieben, behoben wird, dann ist AddAccountViewController defekt (in Bezug auf Obj-C Speicherverwaltungskonventionen). Es ist nicht leicht herauszufinden, wo es kaputt ist, ohne den gesamten Code in AddAccountViewController zu betrachten, der die anAccount-Eigenschaft oder die Backing-Instanzvariable berührt. (Darüber hinaus Präfixe Eigenschaften/Ivars mit "a" oder "an" ist nicht in irgendeiner Kodierung Konvention, die ich kenne, und widerspricht die Orte, wo Apple es verwendet.) –

0

Wann immer Sie ein verwaltetes Objekt löschen, wird das System automatisch alle Referenzen zu diesem Objekt freigeben. Es ist also nicht notwendig, das Objekt programmatisch zu erstellen. Sobald Sie das Objekt dort gelöscht haben, können Sie nicht mehr auf dieses Objekt in der Elternklasse zugreifen.

+1

Das ist nicht wahr. Wenn ein verwaltetes Objekt gelöscht wird, wird es zum Löschen markiert, aber es kann den Speicher nicht freigeben, da es gegen die Speicherverwaltungsrichtlinie von Apple verstößt. –

+0

Ich studiere diese NSManagedObjectContext Klasse, ich fand, dass, wenn die deleteObject Methode aufgerufen wird, das Objekt aus den uniqing Tabellen entfernt wird. –

1

ich ein ähnliches Problem in einem Endung hatte „einen Versuch erkannt, ein Symbol in Systembibliotheken zu nennen, die nicht auf dem iPhone: _Unwind_Resume von Funktion _PFFaultHandlerLookupRow in Bild Coredata genannt.“ Fehlermeldung.

Mein Problem war eine falsche "kaskadierende" Löschregel für eine Beziehung im Modell. Mit dieser Regel wurde mein verwaltetes Top-Objekt gelöscht, aber immer noch im Code referenziert. Nachdem die "Löschregel" für diese Beziehung auf "nulify" gesetzt wurde, funktionierte alles wie geplant.

-> kein Kerndatenproblem ... Designproblem!

Johnny