0

我有一个NSMutableArray包含 200 个子弹(的子类CCSprite),创建如下:

capacity=200;
bullets = [[NSMutableArray alloc] initWithCapacity:capacity];

// Create a number of bullets up front and re-use them whenever necessary.
for (int i = 0; i < capacity; i++)
{
    Bullet* bullet = [Bullet bulletWithScreenRect:screenRect];
    bullet.visible = NO;
    bullet.bulletId=i;
    [bullets addObject:bullet];
    [self addChild:bullet]; 
}

我创建了一个 for 循环来迭代它们并添加了一个断点来查看地址是否相同。

for (int i = 0; i < capacity; i++)
{
    Bullet* bullet = [bullets objectAtIndex:i];
    CCLOG(@"%i %i", i, bullet.bulletId);
}

结果是指针“bullet”对于所有 200 个项目符号 (0x1336c8a0) 始终指向内存中的相同地址。我在项目符号 (int:bulletId) 中添加了一个属性来尝试识别它们是否是不同的对象,但看起来确实如此。我不明白为什么指针总是指向同一个地址(它是指同一个地址吗?还是只是指针内存地址?)。

这是我从Bullet*指针获取 0x1336c8a0 地址的地方:

这是我从 <code>Bullet*</code> 指针获取 0x1336c8a0 地址的地方

4

2 回答 2

0

我会查看 Bullet 类的 bulletWithScreenRect 方法。我假设这是一个工厂方法,但也许它只是返回相同的静态对象。您可以自己分配和初始化 Bullet 对象,然后我假设有一种方法可以单独设置屏幕矩形。

换句话说,改变:

  Bullet* bullet = [Bullet bulletWithScreenRect:screenRect];

对于这样的事情:

  Bullet* bullet = [[Bullet alloc] init];
  bullet.screenRect = screenRect;  // Not sure if this setter is present.

至少,为了进行健全性检查,您可以更改 Bullet 类的构造函数,以确保创建单独的实例。就像我说的,检查 bulletWithScreenRect 方法的内容,看看它到底在做什么。这对我来说似乎是罪魁祸首。

于 2013-01-02T22:26:25.680 回答
0

那么这意味着Bullet您的数组中只有一个实例。在这种情况下,您的问题肯定出在您的bulletWithScreenRect方法中,该方法返回一个缓存实例而不是一个新实例。

您在调试器中看到的地址是指针指向的地址,而不是指针的地址,这或多或少是无用的。由于指针指向的地址总是相同的,很明显我们谈论的是同一个对象。

要测试我刚才所说的内容,您可以打印地址并将其与您在调试器中获得的值进行比较:

NSLog(@"Pointer own address: %p", &bullet);
NSLog(@"Address to where the pointer is pointing: %p", bullet); //this is what you should get in the debugger
于 2013-01-02T22:36:44.940 回答