0

所以这根本没有意义。我有一种扩展方法可以NSMutableArray将项目从一个索引移动到另一个索引。这是一个相当简单的方法,当我在调试配置中编译我的应用程序时它可以完美运行。但是,如果我在发布配置中编译应用程序,如果我从一个项目向下移动(从索引 > 到索引),它会崩溃。崩溃不是索引越界错误。我的局部变量被搞砸了,我不知道为什么。这是整个方法:

- (void)    moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex{
    if (fromIndex == toIndex) return; 
    if (fromIndex >= self.count) return; 
    if (toIndex >= self.count) toIndex = self.count - 1; //toIndex too large, assume a move to end
    id movingObject = [self objectAtIndex:fromIndex];

    if (fromIndex < toIndex){
        for (int i = fromIndex; i <= toIndex; i++){
            [self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : [self objectAtIndex:i + 1]];
        }
    } else {
        //The problem occurs in this block (though the crash doesn't always occur here)
        id cObject;
        id prevObject;
        for (int i = toIndex; i <= fromIndex; i++){
            //usually on the last loop, my "prevObject" become 'messed up' after the following line:
            cObject = [self objectAtIndex:i];
            [self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : prevObject];
            prevObject = cObject;
        }
    }
}

我无法单步执行代码,因为它是发布版本,但我已经在循环的每个步骤中对变量进行了 NSLogged。通常,在最后一个循环中,prevObjectvar 在完成时被分配一些随机变量cObject = [self objectAtIndex:i];。有时它设置为nil但通常它是我的代码中的其他一些随机变量。如果是nil当我尝试替换数组中的对象时代码崩溃。否则,当我尝试访问数组并接收回错误的对象时,它稍后会崩溃。

有谁知道发生了什么?我的意思是,这个问题发生在 4 行代码中,我已经经历了一百多次。

4

1 回答 1

0

好的,就像问题/崩溃没有意义一样,修复也没有任何意义。我已经开始随机更改代码以查看是否可行。移动线:prevObject = cObject到循环的最开始解决了问题。这样做根本没有改变逻辑……纳达……不应该有所作为。然而,它确实做到了。谁说编程是合乎逻辑的?这是有效的代码:

- (void)    moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex{
    if (fromIndex == toIndex) return; 
    if (fromIndex >= self.count) return; 
    if (toIndex >= self.count) toIndex = self.count - 1; //toIndex too large, assume a move to end
    id movingObject = [self objectAtIndex:fromIndex];

    if (fromIndex < toIndex){
        for (int i = fromIndex; i <= toIndex; i++){
            [self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : [self objectAtIndex:i + 1]];
        }
    } else {
        id cObject = nil;
        id prevObject;
        for (int i = toIndex; i <= fromIndex; i++){
            prevObject = cObject;
            cObject = [self objectAtIndex:i];
            [self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : prevObject];
        }
    }
}

那么,有没有人想插播一下这是怎么回事?

于 2012-11-06T15:34:17.543 回答