将一个指针复制到另一个指针会在Objective-C中给出不同的地址

时间:2014-05-01 16:22:00

标签: ios objective-c pointers

我这里有一个奇怪的问题。我有一个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,但有大量缺失的数据。

我知道我可以改写这个以避免指针,但我觉得我需要理解为什么我得到一个完全不同的地址的行为......而不是第一次。

感谢

0 个答案:

没有答案