我有一个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地址的地方:
答案 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