【问题标题】:Filling NSMutableArray for later use in obj-c填充 NSMutableArray 供以后在 obj-c 中使用
【发布时间】:2012-11-05 01:18:05
【问题描述】:

如何为 NSMutableArray 填充一组容量以供以后使用?

基本上我想设置一个 NSMutableArray 来充当我的游戏对象的地图,所以我有这条线...

gameObjects = [[NSMutableArray alloc] initWithCapacity:mapWidth*mapHeight];

我曾希望创建并填充我的 MutableArray,这样我就可以使用这种索引访问它...

int ii = (cellY*mapWidth)+cellX;

NSDictionary *currentObject = [gameObjects objectAtIndex:ii];

但我刚刚了解到 initWithCapacity 不会填充数组,所以我应该创建空白对象来填充它,还是有一个 Null 可以填充它?我也可以用 2 个 for 循环来做到这一点,还是有类似 "initWith:myObject" 的指令?

我希望能够检查数组中的某个索引以查看那里是否有对象,因此我需要能够访问该索引点,并且我只能在那里有东西或我得到一个越界错误。

我将把这个 NSMutableArray 用作对象网格,它是一个组织为二维数组的一维数组,所以我需要能够用 mapWidth*mapHeight 填充它,然后计算索引并检查数组中的该索引。

我看过这里并用谷歌搜索,但找不到像我问的那样的东西。

感谢您的建议。

【问题讨论】:

  • 虽然您可以使用 NSNull 或自定义类实例作为占位符,但我建议您考虑重构,以免您尝试访问未设置的对象,我的意思是您的索引可能需要更好地组织起来。
  • 所以我可以检查一个对象是否在数组中的确切 x,y 位置。

标签: objective-c ios nsmutablearray


【解决方案1】:

我认为您正在寻找的是[NSNull null]。这正是您想要的 - 占位符值。

您可以在this question 中找到有关该主题的更多信息。

【讨论】:

    【解决方案2】:

    initWithCapacity 只是一种性能优化——它对数组行为没有影响,它只是让代码“隐藏”在您添加更多条目时不必反复放大内部数组。

    所以如果你想要一个“预分配”数组,你需要用 NSNull 对象或类似的东西来填充它。然后您可以使用isKindOfClass 来判断对象是否是正确的类型,或者只是将==[NSNull null] 进行比较。 (因为只有一个 NSNull 对象,所以它总是有相同的地址)。

    (或者,您可以使用 C 风格的指针数组,将 nil 值用于空槽。)

    但您最好使用 NSMutableDictionary 代替——无需预先填充,如果元素不存在,您会得到一个 nil 指针。对于键,使用与您的数组索引相对应的 NSNumber 对象。

    【讨论】:

    • 我采用了 [NSNull null] 方法,这似乎可行,但是您的 NSDictionary 想法很有趣,您说不需要预先填写,但是我将如何设置它我在 for 循环中的正确键?
    • @Phil -- 好吧,我不知道你需要 for 循环做什么,但你可以使用,例如,allKeys 给你一个键值列表(以任意顺序)。但是,如果除了随机访问之外,您还需要能够以串行顺序访问“数组”,那么 NSMutableDictionary 可能不是最佳选择(至少在没有其他辅助结构的情况下不是)。
    【解决方案3】:

    initWithCapacity 只提示NSMutableArray 它应该支持这么多对象。在您添加它们之前,它实际上不会有任何对象。此外,数组中的每个条目都是指向对象的指针,而不是标准 c 数组中通常具有的结构。

    您需要改变对问题的看法。如果你不向数组中添加一个对象,它就不在那里。因此,正如您所说,您可以用“空”对象预先填充数组,这很奇怪。或者您可以根据需要添加对象。

    【讨论】:

    • 嗯,问题是我希望能够检查数组中的某个索引,看看那里是否有对象,所以我需要能够访问那个索引点,我只有当那里有东西或者我得到一个越界错误时才能这样做。
    • 如果您在尝试访问索引之前检查计数,并且它小于索引,那么那里没有对象
    • 我将把这个 NSMutableArray 用作对象网格,它是一个组织为二维数组的一维数组,所以我需要能够用 mapWidth*mapHeight 填充它,然后计算索引并检查数组中的索引,上面有人建议 NSNull 所以我可以尝试一下。
    • 很有趣,从未想过使用 NSMutableArray 来表示二维矩阵(我会使用标准的 c 数组)。您必须记住,在 NSArray 中查找并不总是接近恒定时间,在某些情况下它是对数的,因此如果您使用大尺寸,请小心。
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多