EXC_BAD_ACCESS beim Leeren eines gefilterten NSTableViews

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • EXC_BAD_ACCESS beim Leeren eines gefilterten NSTableViews

    Ich programmiere jetzt seit ca. 1 Jahr in Cocoa und das ist der merkwürdigste bug der mir bisher untergekommen ist. Alleine komme ich hier irgendwie nicht weiter.

    In meinem minimalen Beispielprogramm kann man Core-Data-Entities erzeugen, in einem Table anzeigen (arrayController prepares content) und editieren. Die Tabelle wird dabei gefiltert: alle neu angelegten Objekte sind darin sichtbar und können editiert werden. Die Editierung kann dazu führen dass sie aus der Tabelle verschwinden (wegen FilterPredicate und autoRearranges Content). Wenn ich nun mehr als 6 Objekte anlege und diese dann editiere so dass sie aus der Tabelle verschwinden, kommt es zu einem EXC_BAD_ACCESS. Die 'Zombie-Objects'-Einstellung liefert folgende Ursache: [NSAutounbinderObservance observeValueForKeyPath:ofObject:change:context:]: message sent to deallocated instance 0x101c62990.




    Besonders merkwürdig ist folgendes: bei Anlage von maximal 6 Objekten tritt der Fehler nicht auf. Außerdem spielt die Reihenfolge der gelöschten Objekte eine Rolle. Löscht man immer das letzte Objekt in der Tabelle tritt der Fehler auch nicht auf. Löscht man allerdings immer das (jeweils aktualisierte) erste Objekt, dann kommt der bad access (jeweils immer beim Löschen des letzten Objektes in der Tabelle, egal wie viele Objekte man vorher angelegt hat - Hauptsache mehr als 6).

    Das Setup:

    Ich habe einen view-based NSTableView, content ist auf die arrangedObjects-property eines ArrayControllers gebindet und der Inhalt der TableCellViews binden auf ein Attribut einer Core-Data-Entity. Im Beispiel bindet eine Checkbox auf objectValue.important.
    Die Konfiguration des ArrayControllers ist ein bisschen komplizierter, ein Screenshot erklärt wahrscheinlich am meisten:

    [IMG:http://puu.sh/24DEF]


    Person ist dabei eine Core-Data-Entity. Der ManagedObjectContext des ArrayControllers ist natürlich auch gebindet. Viel Code musste ich auch nicht programmieren. Neben dem autogenerierten Core-Data code findet sich in meinem AppDelegate lediglich der Import für Person.h, ein Outlet auf den arrayController und folgende zwei Methoden:

    Quellcode

    1. -(void) awakeFromNib{
    2. NSPredicate* pred = [NSPredicate predicateWithFormat:@"important == YES"];
    3. [self.arrayController setFilterPredicate:pred];
    4. }


    Quellcode

    1. -(IBAction)addPerson:(id)sender{
    2. Person* p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
    3. p.important = @(YES);
    4. [self.managedObjectContext processPendingChanges];
    5. }



    Kann sich irgendwer dieses Verhalten erklären? Gibt es irgenwelche einfachen workarounds?



    PS: ich habe das Beispiel-Projekt im Anhang mal zur Verfügung gestellt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tberg ()

  • Scheint ein Problem mit view-based-tableviews zu sein (mit cellbased klappt es), an CoreData liegt es nicht (siehe Dein angepasstes Beispielprojekt ohne CD, gleicher Crash). Ich würde Dir empfehlen, Dein Demoprojekt mal in den Apple Developerforen zu posten und darüber hinaus einen Bugreport zu verfassen). Der für die Tableviews zuständige Entwickler Corbin Dunn ist dort regelmässig unterwegs und sehr hilfsbereit.

    Gruß, Markus