![](/img/trans.png)
[英]How does CLLocationManager distanceFilter work? Don't you need an update to know where the phone is?
[英]Don't know why loop does not work?
在调试器中它崩溃,我得到这个错误,但是索引号处的对象每次都不断变化。 *由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* -[NSMutableArray insertObject:atIndex:]:空数组的下标15
#define NUMPOINTS 16
#define NUMSPRITES 16
int myXPoints [NUMPOINTS];
int myYPoints [NUMPOINTS];
CCSprite *mySpritePointers [NUMSPRITES];
NSMutableArray *mySpriteArray = [[NSMutableArray alloc] initWithCapacity:16];
[mySpriteArray insertObject:sprite1 atIndex:0];
[mySpriteArray insertObject:sprite2 atIndex:1];
[mySpriteArray insertObject:sprite3 atIndex:2];
[mySpriteArray insertObject:sprite4 atIndex:3];
[mySpriteArray insertObject:sprite5 atIndex:4];
[mySpriteArray insertObject:sprite6 atIndex:5];
[mySpriteArray insertObject:sprite7 atIndex:6];
[mySpriteArray insertObject:sprite8 atIndex:7];
[mySpriteArray insertObject:sprite9 atIndex:8];
[mySpriteArray insertObject:sprite10 atIndex:9];
[mySpriteArray insertObject:sprite11 atIndex:10];
[mySpriteArray insertObject:sprite12 atIndex:11];
[mySpriteArray insertObject:sprite13 atIndex:12];
[mySpriteArray insertObject:sprite14 atIndex:13];
[mySpriteArray insertObject:sprite15 atIndex:14];
[mySpriteArray insertObject:sprite16 atIndex:15];
mySpritePointers [0] = (CCSprite *)[mySpriteArray objectAtIndex:0];
mySpritePointers [1] = (CCSprite *)[mySpriteArray objectAtIndex:1];
mySpritePointers [2] = (CCSprite *)[mySpriteArray objectAtIndex:2];
mySpritePointers [3] = (CCSprite *)[mySpriteArray objectAtIndex:3];
mySpritePointers [4] = (CCSprite *)[mySpriteArray objectAtIndex:4];
mySpritePointers [5] = (CCSprite *)[mySpriteArray objectAtIndex:5];
mySpritePointers [6] = (CCSprite *)[mySpriteArray objectAtIndex:6];
mySpritePointers [7] = (CCSprite *)[mySpriteArray objectAtIndex:7];
mySpritePointers [8] = (CCSprite *)[mySpriteArray objectAtIndex:8];
mySpritePointers [9] = (CCSprite *)[mySpriteArray objectAtIndex:9];
mySpritePointers [10] = (CCSprite *)[mySpriteArray objectAtIndex:10];
mySpritePointers [11] = (CCSprite *)[mySpriteArray objectAtIndex:11];
mySpritePointers [12] = (CCSprite *)[mySpriteArray objectAtIndex:12];
mySpritePointers [13] = (CCSprite *)[mySpriteArray objectAtIndex:13];
mySpritePointers [14] = (CCSprite *)[mySpriteArray objectAtIndex:14];
mySpritePointers [15] = (CCSprite *)[mySpriteArray objectAtIndex:15];
myXPoints [0] = 61;
myXPoints [1] = 61;
myXPoints [2] = 61;
myXPoints [3] = 61;
myXPoints [4] = 180;
myXPoints [5] = 180;
myXPoints [6] = 180;
myXPoints [7] = 180;
myXPoints [8] = 300;
myXPoints [9] = 300;
myXPoints [10] = 300;
myXPoints [11] = 300;
myXPoints [12] = 420;
myXPoints [13] = 420;
myXPoints [14] = 420;
myXPoints [15] = 420;
myYPoints [0] = 37;
myYPoints [1] = 110;
myYPoints [2] = 182;
myYPoints [3] = 253;
myYPoints [4] = 37;
myYPoints [5] = 110;
myYPoints [6] = 182;
myYPoints [7] = 253;
myYPoints [8] = 37;
myYPoints [9] = 110;
myYPoints [10] = 182;
myYPoints [11] = 253;
myYPoints [12] = 37;
myYPoints [13] = 110;
myYPoints [14] = 182;
myYPoints [15] = 253;
for (int nSprite = 0; nSprite < NUMSPRITES; nSprite++){
for (int nPoint = 0; nPoint < NUMPOINTS; nPoint++){
c1array = [[NSMutableArray alloc] initWithCapacity:16];
if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){
[c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint];
}
}
}
答案是-initWithCapacity:
不会执行您认为的操作。 您不会在任何时候将对象插入其中的具有16个空插槽的数组。 您仍然会得到一个空( [array count] == 0
)数组,并且尝试在除位置0之外的任何位置插入对象将失败。 容量参数只是为运行时提供了有关阵列可能增长到多大的高级提示。
要使您的数组实际有16个插槽,以便您可以在<16的任何索引处插入/替换,您需要向其中添加一些对象,例如NSNull。
NSMutableArray* myArray = [[NSMutableArray alloc] initWithCapacity: 16];
for (int i = 0 ; i < 16 ; ++i)
{
[myArray addObject: [NSNull null]];
}
// Now the array has a count of 16.
我不太确定您要做什么,但是我怀疑在您的for循环中,您应该使用-replaceObjectAtIndex:withObject:
而不是-insertObjectAtIndex:
您每次通过循环都在重新分配c1array。 您可能不想这样做。
您是否不应该在两个for循环(nSprite和nPoint)之间分配c1array?
for (int nSprite = 0; nSprite < NUMSPRITES; nSprite++){
for (int nPoint = 0; nPoint < NUMPOINTS; nPoint++){
c1array = [[NSMutableArray alloc] initWithCapacity:16];
if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){
[c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint];
}
}
}
如上所述,每次循环运行时,都要重新分配NSMutableArray。 尝试这个:
c1array = [[NSMutableArray alloc] initWithCapacity:16];
for (int nSprite = 0; nSprite < NUMSPRITES; nSprite++){
for (int nPoint = 0; nPoint < NUMPOINTS; nPoint++){
if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){
[c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint];
}
}
}
阿斯洛我看不到任何理由来创建您正在创建的:S
您可以使用循环而不是为大多数代码重新键入代码;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.