我这里有一个奇怪的问题。我有一个NSMutableArray对象,我将其视为网格。我只是将坐标转换为索引。
我正在向上移动Y坐标,有时需要切换对象。
例如:1101111 - > 1110111 - > 1111011 - > 1111101等(在for循环中每次传递时,将Y表示的对象逐个向上切换Y坐标)
在这个循环中,当我看到我需要移动一个物体时,我正在跟踪我要移动它的位置。它可能会移动多个物体。 我有一个指向nil的对象指针,我使用临时指针循环对象。如果条件匹配,则将临时指针指定给第一个。我第一次这样做它工作正常,之后我得到一个不同的地址。
for (int x = 0; x < nCols; ++x) {
for (int y = 0; y < nRows; ++y) {
CGPoint currentCellCoord = ccp(x,y);
Cell *currentCell = [self activeCellAtCoord:currentCellCoord];
if (currentCell == nil)
continue;
if ([currentCell markedAsMatched]) {
isEmptySpace = YES;
continue;
}
if ([currentCell canMove] == NO) {
continue;
}
if (isEmptySpace) {
// We might have a spot below it
Cell *moveToCell = nil;
for (NSInteger mtc = y-1; mtc >= 0; --mtc) {
CGPoint moveToCoord = ccp(x, mtc);
Cell *tmpGC = [self activeCellAtCoord:moveToCoord];
if ([tmpGC canMove] == NO)
break;
if ([tmpGC markedAsMatched] == YES) {
moveToCell = tmpGC; //Works the first time, after that moveToCell will equal some other value
}
else{
// End of free space, use last one
break;
}
}
if (moveToCell != nil) {
[self exchangeCell:[currentCell currentCoord] toCoord:[moveToCell currentCoord]
animate:YES withDuration:0.5]; //This uses exchangeObjectAtIndex
}
}
}
}
这部分:
if ([tmpGC markedAsMatched] == YES) {
moveToCell = tmpGC; //Works the first time, after that moveToCell will equal some other value
}
在我看到问题的地方,第一次单步执行此操作时,您会看到以下内容:
moveTocell(nil)= tmpGC(0xc55ff480) 然后超越它并且两者都如预期那样相等(0xc55ff480)
现在我们向上移动Y坐标,下次我将看到
moveTocell(nil)= tmpGC(0xc55ff480) 然后跳过它并且tmpGC等于(0xc55ff480)但moveToCell等于(0xbfff645)。
奇怪的moveToCell地址不是我的数组中任何对象的地址,我设置断点来检查Cell创建,但它不会发生。 该对象是一个Cell,但有大量缺失的数据。
我知道我可以改写这个以避免指针,但我觉得我需要理解为什么我得到一个完全不同的地址的行为......而不是第一次。
感谢