Frage

ich gerade schreibe eine iPhone-Anwendung mit Core Data und ich bekomme einen EXC_BAD_ACCESS Fehler während der [managedObjectContext speichern: && Fehler] Codezeilen. Dieser Absturz geschieht erst, nachdem ich bestimmte Felder ändern. Genauer gesagt hat meine Einheit zwei String-Felder (von 10 Feldern), dass ihre Werte aus einer der Rückkehr von einem modalen View-Controller (wie ein Texteditor) bekommen. Der Absturz auch geschieht erst, nachdem diese Felder bearbeitet werden, ich das erste Mal einen Wert in sie funktioniert gut.

Der Grund, warum ich habe Zeichenfolge mit Format Konstrukteuren mit nur Zeichenfolgen, weil ich konstruieren zu kopieren versuchte, ... nicht sicher, ob das automatisch geschieht? Vielleicht dachte behalten / Release Nachrichten von diesen Saiten (die beide sind von dem modal-View-Controller), wurden über die Entlassung des Modal-View-Controller oder etwas veröffentlicht zu werden. Erraten Sie nicht aber, weil es immer noch nicht funktioniert.

Hier ist der Code-Abschnitt, der abstürzt:

[EDITED]

        - (void)actionSheet:(UIActionSheet *)modalView clickedButtonAtIndex:    (NSInteger)buttonIndex
      switch(buttonIndex) {
              case 0: {
                if(message == nil) {
                  message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext];
                }
                message.toString = txtTo.text;
                message.fromString = txtFrom.text;
                message.subjectString = txtSubject.text;
                message.backgroundColor = [NSNumber numberWithInt:[bgColor intValue]];
                message.textArray = [NSString stringWithFormat:@"%@", stringTextArray];
                message.htmlString = [NSString stringWithFormat:@"%@", stringHTML];
                message.timeStamp = [NSDate date];
                message.statusCode = [NSNumber numberWithInt:0];
                NSError *error = nil;
                if (![message.managedObjectContext save:&error]) {
                    abort();
                }   
                break;
               }
              case 1: {
             break;
              }
      }
      if(buttonIndex != modalView.cancelButtonIndex) {
      [webViewBody loadHTMLString:@"<html><head></head><body></body></html>" baseURL:[NSURL URLWithString:@""]];
      [self.navigationController popToRootViewControllerAnimated:YES];
}

}

Und hier ist das Crash-Protokoll:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000015
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x30011940 objc_msgSend + 20
1   CoreData                        0x367f7d3e -[NSKnownKeysDictionary1 dealloc] + 82
2   CoreData                        0x367f7cda -[NSKnownKeysDictionary1 release] + 34
3   CoreData                        0x3687eec4 -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] + 40
4   CoreData                        0x36821030 -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] + 16
5   CoreData                        0x368205f2 -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] + 958
6   CoreData                        0x368133bc -[NSManagedObjectContext save:] + 412
7   Decome                          0x0001fdd6 -[CreateMessageViewController actionSheet:clickedButtonAtIndex:] (CreateMessageViewController.m:163)
8   UIKit                           0x30a6cbd8 -[UIActionSheet(Private) _buttonClicked:] + 256
9   CoreFoundation                  0x30256dd4 -[NSObject performSelector:withObject:withObject:] + 20
10  UIKit                           0x3096e0d0 -[UIApplication sendAction:to:from:forEvent:] + 128
11  UIKit                           0x3096e038 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
12  UIKit                           0x3096e000 -[UIControl sendAction:to:forEvent:] + 44
13  UIKit                           0x3096dc58 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 528
14  UIKit                           0x309a6e9c -[UIControl touchesEnded:withEvent:] + 452
15  UIKit                           0x309a60d4 -[UIWindow _sendTouchesForEvent:] + 520
16  UIKit                           0x309a5464 -[UIWindow sendEvent:] + 108
17  UIKit                           0x30936e3c -[UIApplication sendEvent:] + 400

Jede Hilfe ist willkommen, Danke.

UPDATE: Auch, obwohl das Programm abstürzt, wenn ich es nach oben öffnen wieder die Daten korrekt gespeichert. So ist die EXC_BAD_ACCESS muss geschehen, nach dem Speichern zumindest weit genug bekommen hat, in dem persistenten Speicher zu speichern, denke ich.

Wenn ich die Zeile speichern Kommentar aus, wird der Code jetzt in Ordnung. Aber es funktioniert nicht speichern, nachdem ich schließen und beenden. Wenn ich die sparen Linie in meinen Root-View-Controller willAppear Funktion ausführen, wirft es die gleichen EXC_BAD_ACCESS Fehler. Die Konsole sagt nichts anderes als EXC_BAD_ACCESS wenn ich einen Backtrace erhalte ich:

#0  0x30011940 in objc_msgSend ()
#1  0x367f7d44 in -[NSKnownKeysDictionary1 dealloc] ()
#2  0x367f7ce0 in -[NSKnownKeysDictionary1 release] ()
#3  0x3687eeca in -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] ()
#4  0x36821036 in -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] ()
#5  0x368205f8 in -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] ()
#6  0x368133c2 in -[NSManagedObjectContext save:] ()
#7  0x0000314e in -[RootViewController viewWillAppear:] (self=0x11b560, _cmd=0x3014ecac, animated=1 '\001') at /Users/inckbmj/Desktop/iphone/Decome/Classes/RootViewController.m:85

Leider wurde der Code nicht korrekt vor formatiert. Wenn dieser View-Controller erstellt wird, wenn es nicht eine neue „Nachricht“ ist es eine Nachricht von einem Objekt fetchedResultsController wie so erhielt geben wird:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MailMessage *aMessage = (MailMessage *)[fetchedResultsController objectAtIndexPath:indexPath];
    [messageView loadMessage:aMessage viewOnly:NO usingTemplate:NO];
    messageView.managedObjectContext = self.managedObjectContext;
    [self.navigationController pushViewController:messageView animated:YES]; 
}

(der erste Satz von Code aus der MessageViewController.m-Datei, die die Klasse ist, dass messsageView ist)

Es stürzt nur, wenn ich meinen Editor als modale Ansicht und dann wieder präsentieren. Auch wenn ich die TextArr und htmlString Linien ändern (das sind die einzigen Dinge, die modale Ansicht betrifft) auf:

message.textArray = @"HELLO";
message.htmlString = @"HELLO";

stürzt nach wie vor. Wenn ich beiden Zeilen auf Kommentar aber es nicht zum Absturz bringen.

So scheint es, wie es stürzt ab, wenn ich eine modale Ansicht präsentieren und dann versuchen, entweder die TextArr oder htmlString Felder meiner NSOManagedObject ...

bearbeiten

Hier ist, wo stelle ich die Ansicht:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event {
    if(!viewOnly) {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView: txtTo];
    location = [touch locationInView: webViewBody];
        if(CGRectContainsPoint(webViewBody.bounds, location)) {
            [editor loadTextArrayString:stringTextArray];
            [self presentModalViewController:editor animated:YES];
        }
    }
}

und wo ich die Klage:

-(void)returnWithTextArray:(NSString *)arrayString HTML:(NSString *)html bgColor:(NSNumber *)numColor {
    [self dismissModalViewControllerAnimated:YES];
    self.stringTextArray = [NSString stringWithFormat:@"%@", arrayString];
    self.stringHTML = [NSString stringWithFormat:@"%@", html];
    self.bgColor = [NSNumber numberWithInt:[numColor intValue]];
    [webViewBody loadHTMLString:self.stringHTML baseURL:[NSURL URLWithString:@""]];
}
War es hilfreich?

Lösung 2

Das Problem obwohl ich nicht sicher bin ich die eigentliche Ursache bin Adressierung. Der Fehler wurde beseitigt, wenn ich diese Zeile hinzugefügt:

[managedObjectContext setRetainsRegisteredObjects:YES];

Um, wo ich die managedObjectContext erstellen. Also ich denke, es mit behalten zählt zu tun hatte. Ich vermute, dass vielleicht Instanzvariablen teilweise frei zu bekommen oder vorübergehend oder etwas, wenn modale Ansichten dargestellt werden? Ich weiß es nicht. In jedem Fall wurde dieser Fehler behoben der das Programm funktioniert jetzt.

Andere Tipps

Sie sind nur so lange behalten Zugriff auf ein verwaltetes Objekt aus dem Kontext garantiert als eine Änderung an dieses Objekt anhängig ist (Einfügen, Aktualisieren, Löschen). Sobald Sie einen Anruf tätigen zu speichern :, Sie Bezug auf das verwaltete Objekt verlieren kann.

Während gestoppt Sie den Fehler bekommen, wenn Sie setRetainsRegisteredObjects gesetzt: ja, Sie eine Speicherverwaltung Problem eingeführt haben, als Sie das verwaltete Objekt die Lebensdauer setzen auf die Lebensdauer des verwalteten Objektkontext abhängig zu sein. Wenn Sie Ihren Kontext vorbei sind überall in Ihrer Anwendung um, könnte dies bekommt ziemlich groß, wenn Sie eine große Objekthierarchie haben.

Sie können mehr in der Apple-Dokumentation lesen Sie hier: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html .

Just anderen zu helfen das gleiche Problem haben, und über Steff Reaktion zu verstärken, die wahrscheinliche Ursache für diesen Fehler ist, dass Sie eine NSManagedObject zu lösen versuchen.

Ich habe viele lustigen Verhaltensweisen, die mit Core Data auf dem iPhone zu sehen, die durch das Zurücksetzen Inhalte und Einstellungen im iPhone-Simulator gelöst wurden.

Ich weiß, dass dies ein Oldie, aber ich hatte das gleiche Problem, so dachte ich, meinen tuppence hinzufügen würde, wie ich das Problem gelöst, Mine verursacht wurde durch manuelle das verwaltete Objekt innerhalb des modalen Ansicht Loslassen, entfernte ich die Release-Anrufe und alles funktioniert gut :) nach der Dokumentation sollten Sie nicht manuell versuchen, und lassen Sie verwaltete Objekte ohnehin als der Kontext nach all das aussehen wird. Das ist meine Erfahrung wie auch immer, für über freigegebene Werte durch den Code suchen.

Sie müssen den FRC-Cache auf Null gesetzt

Ich habe ein ähnliches Problem, indem sichergestellt wird gelöst, dass das Objekt abgerufen wird, so zum Beispiel über:

if ( message == nil ) {
    message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext];
} else {
    NSError *error = nil;
    message = (MailMessage *)[managedObjectContext existingObjectWithID:[message objectID] error:&error];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top