Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在Objective C中创建链接列表_Iphone_Objective C_Linked List - Fatal编程技术网

Iphone 在Objective 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;

这是我在.h文件中创建两个结构以保存数据的代码一个事件名称/位置/位置,一个是链表节点。我可以在节点结构中使用事件结构,但是我需要在节点内部使用节点结构。在C++中,这是可行的,但是我如何在Objtovi-C中实现这个?谢谢!< /P> < P>你需要像C.一样命名你的结构:
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++中的工作,因为<代码>节点相当于StultNo.<代码>,如果还没有什么东西被称为“代码>节点< /COD>”(这有时会导致令人困惑的错误,当<代码> Foo既是一个类,也是另一个类的实例方法,它发生在一些编码风格中)。 修复方法是说
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…等等。。。