Sehr geehrte Damen und Herren, ich danke Ihnen im Voraus für Ihre Zeit.
Kürzlich habe ich beschlossen, Objective-C zu lernen (ich bin ein langjähriger C-Hacker) und nach dem Lesen des schönen Textes von Kochan und dem Eintauchen in die Apple-Dokumentation bin ich immer noch verwirrt, wie man am besten eine rekursive Klasse implementiert (d. h. eine Klasse, in der ein ivar den Typ von der gleichen Klasse hat). Nehmen wir einmal an, wir wollen eine Binärbaumklasse implementieren. Zunächst haben wir eine grundlegende Knotenklasse, die ich vereinfacht habe:
@interface MMNode : NSObject {
NSString *label;
}
Jetzt können wir unseren Baum auf zwei verschiedene Arten implementieren. Die erste (und meines Erachtens die naheliegendere) ist, die Rekursion in der Klasse selbst zu platzieren.
@interface MMTree : NSObject {
MMNode *root;
MMTree *leftTree;
MMTree *rightTree;
}
@property (nonatomic, copy) MMNode *root;
@property (nonatomic, retain) MMTree *leftTree;
@property (nonatomic, retain) MMTree *rightTree;
Die zweite Methode, die in der wunderbaren CHDataStructures.framework implementiert diese Datenstruktur wie folgt:
typedef struct MMTreeNode {
MMNode *node;
// union {
// struct {
struct MMTreeNode *leftTree;
struct MMTreeNode *rightTree;
// };
// };
} MMTreeNode;
@interface MMTreeStruct : NSObject {
MMTreeNode *root;
}
Hier ist die Lösung eher "pointer-riffic", wobei die Rekursion in die die Struktur verschoben. (Wie in den Kommentaren erwähnt, sind die anonymen Strukturen und Unions nicht erforderlich. Da jedoch viele Anwendungen zusätzliche Informationen zusätzliche Informationen an jedem Knoten benötigen, werde ich den Code so lassen, wie er ist).
Ich habe beide Lösungen implementiert und sie funktionieren gut. Die erste scheint einfacher, mehr "OO"; die zweite, mehr "C-zentrisch" mit etwas komplizierteren Quellen.
Ist die letztere Technik vorzuziehen? Wenn ja, was ist ein objektiver Grund? Ich kann nur feststellen, dass letzteres vielleicht speicherfreundlicher ist, da die Struktur eine feste Größe hat.
Nochmals vielen Dank an StackOverflow und an die CocoaHeads.
UPDATE: Ich sollte hinzufügen, dass es scheint, dass das CoreFoundation-Objekt CFTree verwendet eine ähnliche Strukturimplementierung.