Frage

Ich verwende eine NSFetchedResultsController in einer Tabellenansicht geholt verwalteten Objekte Anzeige zu verwalten, die einen Abschnitt hat. Die Tabelle beginnt leer und der Benutzer kann neue Entitäten die Benutzeroberfläche verwenden, um es hinzuzufügen. Wie es aussieht, arbeitet das Programm immer dann, wenn die erste Instanz das Hinzufügen, und immer stürzt ab, wenn eine zweite Zugabe. Es ist manchmal kein Fehler bei dem Absturz präsentiert und zu anderen Zeiten gibt es Fehler von Typen unterscheiden (etwas weiter unten enthalten). Durch Protokollanweisungen und Tracing ich sehe, dass das Programm stürzt kurz nach dem controllerWillChangeContent des NSFetchResultsController des Delegierten (die nennt [self.tableView beginUpdates];) Verfahren beendet wird, aber vor einem anderen Verfahren in meinem Code aufgerufen wird. Hier sind einige der relavant Teile meines Codes. Konfigurieren des NSFetchedResultsController:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Beer"
                                    inManagedObjectContext:self.managedObjectContext]];

// Configure request's entity and predicate
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSString *expression = [NSString stringWithFormat:@"brewery.name LIKE \"%@\"", self.brewery.name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
[fetchRequest setPredicate:predicate];
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                             managedObjectContext:self.managedObjectContext
                                                               sectionNameKeyPath:nil
                                                                        cacheName:nil];
self.resultsController.delegate = self;
[fetchRequest release];

NSError *error = nil;
BOOL success = [resultsController performFetch:&error];
if (!success) {
    NSLog(@"Error fetching request %@", [error localizedDescription]);
}

Das Hinzufügen von neuer Einheit:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Beer" inManagedObjectContext:self.managedObjectContext];
Beer *beer = [[Beer alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
beer.name = beerName;
beer.brewery = self.brewery;

Ich habe die Warnungen in der Dokumentation über Probleme gesehen Tabellen mit einem Abschnitt anzeigt, und ich habe Apples Abhilfe für die ohne Erfolg verwendet. Diese Verfahren sind ohnehin nicht vor dem Absturz genannt zu werden.

Einige der Fehler, die ich erhalten haben:

Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFString compareObject:toObject:]: unrecognized selector sent to instance 0x4e808c0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer compareObject:toObject:]: unrecognized selector sent to instance 0x4e53b80 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[UITextTapRecognizer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4ca5d70 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4e271a0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFNumber countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x4c96ee0 with userInfo (null)

Wie Sie sehen können, die Fehler (wenn man vorgestellt wurde) nicht konsistent sind, auch wenn keine Änderung am Code vorgenommen wurde.

Kann jemand herausfinden, was ich falsch mache?

War es hilfreich?

Lösung

Punkte Ihre inkonsistent Fehler zu einem möglichen über Freisetzung Problem. Vor allem Ihre Teilnehmer seit Ändern nur die Daten neu zu laden macht das Problem weg. Persönlich würde ich die Zeit investieren, um das Problem zu lösen, anstatt Codierung um ihn herum, wie Sie auf jeden Fall ein Code Problem, dass es mit wahrscheinlich sonst später irgendwo auftauchen.

Ich würde folgendes tun:

  1. Schalten Sie NSZombie
  2. Fügen Sie einen Haltepunkt für objc_exception_throw
  3. Ausführen im Debugger

Wenn die Ausnahme auftritt, sehen Sie die Speicheradresse und sehen, was zugegriffen wird und wo. Dadurch wird das Problem isolieren und sagen, was los ist. Es wäre auch hilfreich sein, wenn das nicht das Problem deutlich macht, Ihre NSFetchedResultsController Delegatmethoden zu veröffentlichen, damit ich sehen kann, ob es etwas seltsam in ihnen ist.

Am besten die ursprüngliche Frage mit der zusätzlichen Information zu aktualisieren.

Andere Tipps

Ihr Code neue Einheiten zu schaffen, ist alles seltsam. Was über diese stattdessen mit:

Beer* beer = [NSEntityDescription insertNewObjectForEntityForName: @"Beer" 
    inManagedObjectContext: self.managedObjectContext];
beer.name = @"Grolsch";

Auch Sie rufen nicht NSManagedObjectContext#save:. Aber vielleicht, dass Sie tun, in einem Teil des Codes, dass Sie haben jetzt zeigen?

Auch wenn ich nicht dieses spezielle Problem lösen hatte, nahm ich einen etwas anderen Ansatz, die Klasse zu schreiben, die die Funktionalität gab ich will und nicht Ursache das Problem entstehen. Ich verwende noch NSFetchedResultsController, sondern als alle vier Delegatmethoden Umsetzung, ich bin nur der Umsetzung controllerDidChangeContent :, die nur Anrufe [Tableview reload].

Dies ist die Implementierung, die in der RootViewController Klasse enthalten ist, wenn Sie eine neue Navigation-basierte Anwendung in XCode erstellen, die Kerndaten für die Speicherung verwendet. Sie haben wahrscheinlich eine gewisse Kontrolle über tabellen bearbeiten Animationen verlieren, aber es ist viel einfacher und funktioniert gut für meine Zwecke.

Ich hatte ein ähnliches Bug vor kurzem - Ihr Problem ist, mit über die Freigabe, insbesondere:

[sortDescriptors release];

Sie erhalten die sortDescriptors Objekt aus

[NSArray arrayWithObjects:sortDescriptor, nil];

welches nicht „alloc“, „Kopieren“ oder „neu“, so ist es ein Autoreleased Objekt zurückgibt. Weil Sie es früh loslassen, erhalten Sie zwei Orte, wo man kann abstürzen - wenn die NSFetchRequest es verwendet, und wenn es am Pool freigegeben wird. Siehe Apfel Speicherverwaltung für weitere Details .

Dies ist ein alter, aber zum Wohl der anderen das gleiche Problem habe ich Stunden damit verbracht, versuchen zu verstehen, was los ist und habe endlich ein Problem mit meiner Art Beschreiber, die diese zufälligen Abstürze verursacht wurde.

Die Fehlermeldungen variiert wurden aber meist im Zusammenhang mit einem compareObject. ToObject Selektor nach unten

- [_ NSCFSet compareObject: toObject:]: Unbekannter Selektor gesendet Instanz - [ _NSCFString compareObject: toObject:] Unbekannter Selektor an Instanz gesendet

Mein Vorschlag ist, alle Art Deskriptoren und Prädikate aus dem Code, um zu versuchen und zu beseitigen und sie dann eine hinzufügen, indem Sie einen zu finden, wo das Problem ist.

Viel Glück! Rog

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top