S. 29: Fehlendes Semikolon

In der zweiten Zeile fehlt ein abschließendes Semikolon

S.31: Eine eckige Klammer ist zu viel

– (BOOL) performDragOperation:(id <NSDraggingInfo>)sender {

NSArray *dragAndDropFiles = [[sender draggingPasteboard propertyListForType:NSFilenamesPboardType];

for (NSString *filePath in dragAndDropFiles) {

BOOL isADirectory = NO;

if([[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isADirectory] ] && !isADirectory) {

ImageItem *p = [[ImageItem alloc] initWithPath:filePath]; [importedImages addObject:p]; [p release];

}

[imageBrowserView reloadData]; return YES;

}

}

In der If-Bedingung ist eine eckige Klammer zu viel

S.32: Änderung des Protokolls (int vs. NSUInteger)

Download: – (NSUInteger) numberOfItemsInImageBrowser:(IKImageBrowserView *) view

Buch: – (int) numberOfItemsInImageBrowser:(IKImageBrowserView *) view

Zur Erklärung siehe auch IKImageBrowserDataSource Protocol Reference (int vs. NSUInteger).

S.33: Änderung des Protokolls (int vs. NSUInteger)

Download: – (id) imageBrowser:(IKImageBrowserView *) view itemAtIndex:(NSUInteger) index

Buch: – (id) imageBrowser:(IKImageBrowserView *) view itemAtIndex:(int) index

Zur Erklärung siehe auch IKImageBrowserDataSource Protocol Reference (int vs. NSUInteger).

S. 36: Number of Images

Bei der ersten Zuweisung muß natürlich die Anzahl der Bilder (numberOfImages) berechnet werden und nicht die Anzahl der Gruppen:

int numberOfImages = [self numberOfItemsInImageBrowser:imageBrowserView]; [groupArray count];

S. 36: Speicherleck

Folgender Aufruf erzeugt ein Speicherleck:

[importedImages sortUsingDescriptors:[[NSArray alloc] initWithObjects:sortDesc,nil]];

und muß folgendermaßen abgeändert werden:

[importedImages sortUsingDescriptors:[NSArray arrayWithObject:sortDesc]];

Grund für das Speicherleck ist, daß das Array allokiert wird und die Sort-Methode entweder ein copy oder retain macht. Damit ist der retain-Count um eins zu hoch. Da man keinen Zugriff mehr auf das Array hat, ist ein release nicht mehr möglich.

S. 37:  Fehlendes Leerzeichen zwischen NSValue und valueWithRange

Die Zuweisung muß also folgendermaßen aussehen:

NSDictionary *newGroup = [NSDictionary dictionaryWithObjectsAndKeys:

[NSValue valueWithRange:range], IKImageBrowserGroupRangeKey,

[NSNumber numberWithInt:groupingStyle], IKImageBrowserGroupStyleKey,

name, IKImageBrowserGroupTitleKey,

groupColor, IKImageBrowserGroupBackgroundColorKey,

nil];

S.38: Fehlender Methodenaufruf

In der Methode – (BOOL) performDragOperation:(id <NSDraggingInfo>)sender fehlt der Aufruf [groupArray removeAllObjects];. Folge ist, daß beim zweiten Aufruf der Methode die Bilder nicht richtig angeordnet werden.

S.41: Fehlende Initialisierung mit nil

NSColor* groupColor = nil;

Die Variable muß mit nil initialisiert werden, weil sie später verwendet wird. Probleme treten auf, wenn keine Bilder in die View gezogen wurden oder wenn zwischen den beiden Gruppierungsarten gewechselt wird ohne vorher Bilder zu laden.

S.44: Besseres Englisch

Die folgenden Zeile:

NSLog(@“Burn images %d to CD“, [importedImages count]);

durch diese Zeile:

NSLog(@“Burn %d images to CD“, [importedImages count]);

ersetzen.

S.44: Deprecated Methode ersetzen

Die folgende Zeile:

[[NSFileManager defaultManager] createDirectoryAtPath:burnPath attributes:nil];

sollte durch diese Zeile:

[[NSFileManager defaultManager] createDirectoryAtPath:burnPath withIntermediateDirectories:YES attributes:nil error:&error];

ersetzt werden. Grund dafür ist, daß ab 10.5 die erste Methode als deprecated markiert ist. Siehe Apple-Dokumentation.

S.44: NSLog

Die Zeile:

NSLog(destination);

durch die Zeile

NSLog(@“%@“, destination);

ersetzen.

S.47: Geschweifte Klammer

Vor return YES; ist eine geschweifte Klammer zu viel.

S.48: for-Schleife statt while-Schleife

Unter dem ersten Block mit Source-Code wird von „while-Schleifen“ geredet. Es sind natürlich die „for-Schleifen“ auf Seite 47 gemeint. (Das passiert, wenn man den Quellcode in letzter Minute vor Abgabe ändert. :-?)

preload preload preload