亲爱的各位:提前感谢您的时间。
最近,我决定学习Objective-C(我是长期的C语言黑客),在阅读Kochan的精美文本并深入研究苹果文档后,我仍然困惑于实现递归类的最佳方法(即一个具有相同类类型的ivar的类)。为了具体说明,让我们假设我们希望实现一个二叉树类。首先,我们有一个基本的节点类,我已经简化为:
现在我们可以用两种不同的方式来实现我们的树。第一种(我认为更明显的方法)是将递归放在类本身中。
第二种方法是在精美的CHDataStructures.framework中使用的,它将此数据结构实现如下:
我已经实现了这两种解决方案,它们都很好用。前者似乎更加直观、更符合"OO"的思想;后者则更加"以C为中心",源代码略微复杂。
后一种技术是否更优?如果是这样,有什么客观原因呢?我只能确定的是,也许后者在内存方面更友好,因为该结构具有固定的大小。
再次感谢StackOverflow和CocoaHeads。
更新:我应该补充说明的是,CoreFoundation对象CFTree使用了类似的结构实现。
最近,我决定学习Objective-C(我是长期的C语言黑客),在阅读Kochan的精美文本并深入研究苹果文档后,我仍然困惑于实现递归类的最佳方法(即一个具有相同类类型的ivar的类)。为了具体说明,让我们假设我们希望实现一个二叉树类。首先,我们有一个基本的节点类,我已经简化为:
@interface MMNode : NSObject {
NSString *label;
}
现在我们可以用两种不同的方式来实现我们的树。第一种(我认为更明显的方法)是将递归放在类本身中。
@interface MMTree : NSObject {
MMNode *root;
MMTree *leftTree;
MMTree *rightTree;
}
@property (nonatomic, copy) MMNode *root;
@property (nonatomic, retain) MMTree *leftTree;
@property (nonatomic, retain) MMTree *rightTree;
第二种方法是在精美的CHDataStructures.framework中使用的,它将此数据结构实现如下:
typedef struct MMTreeNode {
MMNode *node;
// union {
// struct {
struct MMTreeNode *leftTree;
struct MMTreeNode *rightTree;
// };
// };
} MMTreeNode;
@interface MMTreeStruct : NSObject {
MMTreeNode *root;
}
这里的解决方案更加"指针化",将递归推入结构中。(正如评论中提到的,匿名结构和联合体并不是必需的。但是,由于许多应用程序需要在每个节点上添加附加信息,因此我将保留代码原样)。
我已经实现了这两种解决方案,它们都很好用。前者似乎更加直观、更符合"OO"的思想;后者则更加"以C为中心",源代码略微复杂。
后一种技术是否更优?如果是这样,有什么客观原因呢?我只能确定的是,也许后者在内存方面更友好,因为该结构具有固定的大小。
再次感谢StackOverflow和CocoaHeads。
更新:我应该补充说明的是,CoreFoundation对象CFTree使用了类似的结构实现。