TahDoodle crashes when opening files


#1

Hey folks,

at first I have to say: The book is great. The money is really worth it!! Thanks to all. :slight_smile:

Now my problem. Everything works fine, but when I want to Open a file saved with TahDoodle, the program crashes.
I took a look into the “Leaking” instrument and saw many leaks. But i don’t know how to fix it.

Here is my code :
(ignore the german comments. It’s just because I bought the german version of the book because of my origin g)

BNRDocument.m


#import "BNRDocument.h"

@implementation BNRDocument

# pragma mark - NSDocument Overrides

- (id)init
{
    self = [super init];
    if (self) {
        // Add your subclass-specific initialization here.
        // If an error occurs here, return nil.
    }
    return self;
}

- (NSString *)windowNibName
{
    // Override returning the nib file name of the document
    // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
    return @"BNRDocument";
}

# pragma mark - Actions

- (IBAction)createNewItem:(id)sender
{
    // Falls es noch kein Array gibt, erstellen Sie einfach
    // eines, in dem unsere neue Aufgabe gespeichert wird
    if (!toDoItems) {
        toDoItems = [[NSMutableArray alloc]init];
    }
    [toDoItems addObject:@"New Item"];
    
    // -reloadDate aktualisiert die Tabellenansicht und fordert von
    // dataSource (das in diesem Fall zufällig dieses BNRDocument ist)
    // neue Daten zur Darstellung an
    [itemTableView reloadData];
    
    // -updateChangeCount: teilt der Anwendung mit, ob im Dokument
    // ungespeicherte Ă„nderungen vorhanden sind oder nicht.
    // NSChangeDone kennzeichnet das Dokument als ungespeichert
    [self updateChangeCount:NSChangeDone];
}

# pragma mark - Data Source Methods

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tv
{
    // Diese Tabellenansicht soll die todoItems darstellen,
    // und somit ist die Zahl der Einträge in der Tabellenansicht
    // gleich der Zahl der Objekte im Array
    return [toDoItems count];
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    // Gibt das Element aus todoItems zurĂĽck, das mit der Zelle
    // korrespodiert, die die Tabellenansicht darstellen will
    return [toDoItems objectAtIndex:row];
}

- (void)tableView:(NSTableView *)tableView
   setObjectValue:(id)object
   forTableColumn:(NSTableColumn *)tableColumn
              row:(NSInteger)row
{
    // Ă„ndert der Benutzer ein To-do-Element in der Tabellenansicht
    // wird das totoItems-Array aktualisiert
    [toDoItems replaceObjectAtIndex:row withObject:object];

    // Dann wird das Dokument gekennzeichnet, es habe
    // ungespeicherte Ă„nderungen
    [self updateChangeCount:NSChangeDone];
}

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    [super windowControllerDidLoadNib:aController];
    // Add any code here that needs to be executed once the windowController has loaded the document's window.
}

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    // Diese Methode wird beim Speichern unseres Dokuments aufgerufen
    // Wir sollen dafĂĽr sorgen, dass der Aufrufer ein NSData-Objekt bekommt,
    // das unsere Daten umhüllt um sie auf Festplatte schreiben zu können

    // Falls es kein Array gibt, schreibn wir fĂĽrs Erste ein leeres Array
    if (!toDoItems) {
        toDoItems = [[NSMutableArray alloc]init];
    }
    
    // Packt unser toDoItems-Array in ein NS Data-Objekt
    NSData *data = [NSPropertyListSerialization dataWithPropertyList:toDoItems
                                                              format:NSPropertyListXMLFormat_v1_0
                                                             options:0 
                                                               error];
    
    // Gibt das neu gepackte NSData-Objekt zurĂĽck
    return data;
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    // Diese Methode wird aufgerufen, wenn ein Dokument geladen wird
    // Wir bekommen ein NSData-Objekt und sollen daraus unsere Daten ziehen
    
    // Extrahiert ToDoItems
    toDoItems = [NSPropertyListSerialization propertyListWithData:data 
                                                          options:NSPropertyListMutableContainers
                                                           format:NULL
                                                            error];
    
    // Gibt unabhängig vom obigen Aufruf Erfolg oder Misslingen zurück
    return (toDoItems !=nil);
}
@end

BNRDocument.h

[code]#import <Cocoa/Cocoa.h>

@interface BNRDocument : NSDocument
{
NSMutableArray *toDoItems;
IBOutlet NSTableView *itemTableView;
}

-(IBAction)createNewItem:(id)sender;

@end
[/code]

I red alle code parts 5 times and my girlfriend did 2 times. But everything written in the book is in my application even the fix from this post:
viewtopic.php?f=160&t=3494

If you can help me, it would be great! Thank you :slight_smile:

Best wishes,
Christian