【问题标题】:index 0 beyond bounds for empty array索引 0 超出空数组的范围
【发布时间】:2014-05-01 15:06:49
【问题描述】:

我收到了上述错误,但不确定为什么,因为我确定它们是数组中的东西。我首先在 .h 文件中声明了 NSMutableArray。在我创建场景的 .m 文件中,我创建了一个纹理并将其添加到数组中,如下所示:

texture = [SKTexture textureWithImageNamed:@"obstacle"];
array = [NSMutableArray arrayWithObject:texture];

在我的其余代码中,我有使用这个数组来创建精灵节点的方法:

SKSpriteNode *obstacle = [SKSpriteNode spriteNodeWithTexture:[array objectAtIndex:0]];

哪个有效,我可以看到这些精灵节点的图像obstacle。但是在场景结束时,当我尝试[array removeAllObjects]; 时,我得到了上述错误。当我的SKSpriteNode 只是从中绘制纹理时,数组中怎么没有任何内容?

【问题讨论】:

  • 您在使用 ARC 吗?它被宣布为强吗?

标签: objective-c sprite-kit


【解决方案1】:

我感觉您误解了对象所有权。您正在创建一个SKTexture 对象并将指针(或引用)传递给该对象。这就是你正在做的:

  1. 创建SKTexture 对象并在array 中保留对它的引用,从而保留该对象。
  2. 使用上述纹理创建一个SKSpriteNode 对象,该对象可能会保留或复制它(我不确定,如果您不知道区别,那么您需要学习内存管理的基础知识)。李>
  3. array 中删除所有对象(实际上是在删除引用),这会释放它们(但可能不会破坏它们)。

在第 3 步之后,纹理仍然存在于 SKSpriteNode 中,但在 array 中不再引用它。因此,如果在第 3 步之后您尝试访问来自 array 的任何索引,那么您正在尝试访问超出数组的边界,这就是触发崩溃的原因。

【讨论】:

  • 我有点听从你的话,我从来没有彻底阅读过内存管理,因为这是我的第一个编码项目。我想要的数组是在我需要时加载图像,并在场景发生变化时完全摆脱它,不让它保留它的内存,从而导致内存无休止地增加。我怎样才能修复我必须完全摆脱数组,释放和销毁其中的任何对象?
  • 通过让每个场景保留一系列(即负责)其纹理,让您的生活更轻松。当它被移除和销毁时,它会自动销毁它的所有子元素和数组。
  • 这是唯一使用数组或任何纹理的场景,当场景发生变化时,数组不会释放任何东西。我可以说,因为当我运行仪器时,我上面的 SKSpriteNode 只是在内存中不断攀升,它会加载纹理,但它永远不会被释放。
  • 那么你没有发布SKSpriteNode。如果您真的需要更多帮助,那么您将不得不发布更多代码。您可以通过编辑上面的答案来做到这一点。
  • 我将创建另一个问题,因为它确实与这里提出的问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多