在Objective C中创建链接列表

时间:2010-11-23 23:48:00

标签: iphone objective-c linked-list

typedef struct {
    NSString *activty;
    NSString *place;
    float latitude;
    float longitude;
} event;

typedef struct {
    event *thing;
    Node *next;
} Node;

这是我的.h文件中的代码,用于创建两个用于保存数据的结构(一个用于事件名称/位置/位置,一个用于链接列表的节点。我可以使用事件结构node struct,但是我需要在自身内部使用节点结构。在C ++中这可以工作,但是如何在objective-c中实现呢?谢谢!

3 个答案:

答案 0 :(得分:21)

为什么要使用结构?只需使用一个类:

@interface MyEvent:NSObject
@property(copy) NSString *activity;
@property float latitude;
... etc ...
// and that linked list gunk
@property(retain) MyEvent *nextEvent;
@end

@implementation MyEvent
@synthesize activity, latitude, nextEvent;

- (void) dealloc
{
    [activity release], activity = nil;
    [nextEvent release], nextEvent = nil;
    [super dealloc];
}
@end

与结构相比没有明显的开销(如果方法调用真的可以测量,你甚至可以直接暴露ivars)。更好的是,当你想要存档结构,添加业务逻辑或做任何有趣的事情时,你可以简单地添加方法。

答案 1 :(得分:2)

您需要像在C中一样命名您的结构。例如:

typedef struct Node {
    event *thing;
    struct Node *next;
} Node;

更好的问题是,为什么你想首先制作这个链表?为什么不使用框架提供的容器类型之一?

答案 2 :(得分:-1)

我认为你会发现它在C ++中不起作用(但它们可能已经改变了语法规则,所以它确实如此)。你可能意味着更像这样的东西:

struct Node {
    event *thing;
    Node *next;
};

这适用于C ++,因为Node等同于struct Node,如果还没有名为Node的东西(当Foo都是类时,这有时会导致令人费解的错误和另一个类的实例方法,它发生在一些编码风格中。)

解决方法是struct Node。我更喜欢这个;它似乎更纯净。使用typedef有一些很好的理由(例如TUInt64之类的东西,由于缺乏编译器支持,它们在历史上可能是一个结构体)。如果你确实使用了typedef,那么没有理由给结构赋一个不同的名称,因为它们位于不同的名称空间中(IIRC结构是一个“标记命名空间”)。

通常的typedef版本是这样的:

typedef struct Node Node;
struct Node {
    event *thing;
    Node *next;
};

或者,将文件扩展名更改为.mm,然后它就可以了,因为您正在编译Objective-C ++!