ObjC:最好使用NSArray或NSDictionnary(zBuffer)?

时间:2012-04-28 09:04:37

标签: objective-c arrays nsarray hashmap nsdictionary

假设我有一个“节点”实例的集合。整数属性调用zIndex将用于对它们进行分组。

存储它们的优点/缺点是什么: 1)数组数组 2)数组字典

在伪代码中,我会像这样描述预期的结果:

zBuffer[100] = [node1, node 2];
zBuffer[105] = [playerNode, collectable1];
zBuffer[110] = [foreground1, foreground2];

我想知道zBuffers应该是什么; NSArrays必须只用于顺序读/写吗?喜欢不使用非连续索引?

我尝试过使用NSMutableArray:

[zBuffer objectAtIndex:zOrder]

但是如果数组不包含该索引的数据(如超出范围的异常),它就会失败。

感谢您的建议! Ĵ

2 个答案:

答案 0 :(得分:2)

据我所知,您的一个要求是您用来访问zBuffer的索引不是连续的(100,105,100)。在这种情况下,我不会使用数组,因为可以与数组一起使用的索引必须小于数组元素的count(如果你有3个元素,那么索引范围从0到2)。

相反,我会使用NSMutableDictionary,您可以使用zIndex键作为您要查找的对象组的“名称”。

此建议未考虑您可能具有的任何其他要求,尤其是关于复杂性以及您将在节点集合上执行的操作类型(除了通过zIndex访问它们之外)。

答案 1 :(得分:1)

你实际上可以提供两者。看起来你想拥有的是一个稀疏数组:所以你按索引查找对象,但允许在某个索引处没有对象。所以你可以做到。

我是通过创建一个实现the primitive methods documentedNSMutableArray子类来实现的。在内部,您的子类将使用NSMutableDictionary进行存储,并使用数字(“填充”索引)作为键。 -objectAtIndex:返回带有该数字作为其键的对象,如果该数组在该点为空,则返回nil

在使用数组合同时存在一些含糊不清的问题,由您来决定如何解决:

  • count会返回1+(使用中的最高索引),还是数组中的对象数?
  • 枚举器和快速枚举模式永远不会期望看到nil,所以如果你想要你的类的用户,你需要提出一个总是返回一个对象的枚举器(但让我看看它在哪个索引)到数组的枚举器。
  • 您无法使用+arrayWithObjects: (id) firstObject,...初始化模式对其进行初始化,因为他们使用nil作为哨兵。