Cocos2d / iOS:无法理解如何解释指针地址

时间:2013-01-02 21:18:40

标签: ios pointers memory cocos2d-iphone

我有一个NSMutableArray包含200个子弹({1}}的子级),如下所示:

CCSprite

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

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]; 
}

结果是指针“bullet”总是指内存中所有200个子弹(0x1336c8a0)的相同地址。我在bullet(int:bulletId)中添加了一个属性来尝试识别它们是否是不同的对象,但似乎是这样。 我不明白为什么指针总是指向同一个地址(它是指同一个地址?还是指针存储器地址?)。

这是我从for (int i = 0; i < capacity; i++) { Bullet* bullet = [bullets objectAtIndex:i]; CCLOG(@"%i %i", i, bullet.bulletId); } 指针获取0x1336c8a0地址的地方:

Here is where I get the 0x1336c8a0 address from the <code>Bullet*</code> pointer

2 个答案:

答案 0 :(得分: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方法的内容,看看它到底在做什么。这似乎是我的罪魁祸首。

答案 1 :(得分: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