Iphone 在Objective C中创建链接列表
这是我在.h文件中创建两个结构以保存数据的代码一个事件名称/位置/位置,一个是链表节点。我可以在节点结构中使用事件结构,但是我需要在节点内部使用节点结构。在C++中,这是可行的,但是我如何在Objtovi-C中实现这个?谢谢!< /P> < P>你需要像C.一样命名你的结构:Iphone 在Objective C中创建链接列表,iphone,objective-c,linked-list,Iphone,Objective C,Linked List,这是我在.h文件中创建两个结构以保存数据的代码一个事件名称/位置/位置,一个是链表节点。我可以在节点结构中使用事件结构,但是我需要在节点内部使用节点结构。在C++中,这是可行的,但是我如何在Objtovi-C中实现这个?谢谢!< /P> < P>你需要像C.一样命名你的结构: typedef struct { NSString *activty; NSString *place; float latitude; float longitude; } event;
typedef struct {
NSString *activty;
NSString *place;
float latitude;
float longitude;
} event;
typedef struct {
event *thing;
Node *next;
} Node;
不过,一个更好的问题是,为什么首先要创建此链表?为什么不使用框架提供的一种容器类型?为什么要使用结构?只需使用一个类:
typedef struct Node {
event *thing;
struct Node *next;
} Node;
没有显著的开销与结构(如果方法调用是可测量的,甚至可以直接暴露IVAR)。更好的是,在你想存档结构、添加业务逻辑或做其他有趣的事情的时候,你可以简单地添加方法。
< P>我想你会发现它在C++中不起作用。(但是他们可能已经改变了语法规则,所以它就改变了)。你的意思可能更像这样:@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
struct Node {
event *thing;
Node *next;
};
<>这是C++中的工作,因为<代码>节点相当于struct Node
。我更喜欢这样;它看起来更纯粹。使用typedef有一些很好的理由(例如TUInt64
之类的东西,由于缺乏编译器支持,它在历史上可能是一个struct)。如果确实使用typedef,则没有理由为结构赋予不同的名称,因为它们位于不同的命名空间中(IIRC结构是一个“标记命名空间”)
通常的typedef版本如下所示:
@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
struct Node {
event *thing;
Node *next;
};
或者,将文件扩展名更改为.mm,然后它就可以工作了,因为您正在编译Objective-C++!您建议使用什么来保持多个数据类型的连接?我应该只将事件结构存储在NSMutableArray中吗?这是正常的事情。如果您想要复合方法(例如,您可以将普通结构传递给现有的C代码)然后,您可以使用NSValue+valueWithPointer:创建一个能够进入Objective-C集合但只指向其他对象的对象。最后一个问题:我不能使用addObject将结构推送到数组…正确的方法是什么?谢谢!-1未定义的行为;节点是保留标识呃(任何以[A-Z]开头的都在C中)。@tc,很好的捕获-在这种情况下,这不太可能是一个问题,但很容易修复。@tc,OP的原始
事件结构也不是,bbum指出,根据他前面提到的原因,类将是普通C结构的更好替代品。现在,它是一个链接列表。:)另外,在ARC中,你不能轻易地在结构中使用对象,所以你无论如何都必须使用类。结构更干净。使用类的唯一原因是如果它是苹果的类,带有预先制作的函数。奇怪的是,我似乎找不到一个。@9000结构更干净,直到你想将它们保存到任何苹果提供的API中…你想要的要添加业务逻辑…您需要提供各种格式逻辑…您需要充分利用ARC…等等。。。