XCode调试器意外地切换当前执行行

时间:2013-05-26 18:57:38

标签: ios objective-c cocoa

当我尝试调试此代码时,最奇怪的事情发生了:

- (IBAction)showNextMeal:(id)sender {
    unsigned int flags = NSHourCalendarUnit | NSMinuteCalendarUnit;
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDateComponents* components = [calendar components:flags fromDate:[NSDate date]];
    NSDate* currentTime = [calendar dateFromComponents:components];
    NSArray* todays = [self MealsForDay:DayOfWeek];
    int segueid = 0;
    for (int i = 0; i < 3; i++) {

        NSDate * startTime = [calendar dateFromComponents:[calendar components:flags fromDate:[[todays objectAtIndex:i] End]]];
        NSComparisonResult c = [currentTime compare:startTime];

        if (c == NSOrderedAscending) {
            segueid = i;
            break;
        }
    }
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:segueid inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    [self performSegueWithIdentifier:@"MealSegue" sender:self];
}

代码运行正常,直到第三行到最后一行(NSIndexPath* indexPath),而不是跳回int segueid = 0并再次运行。如果数字出来之后,iphone会在同一个地方执行两次分段。

我有屏幕捕获调试,所以你可以看到我正在谈论的内容。

http://www.youtube.com/watch?v=3SR-O5Xhsqk

为什么计算机会跳过代码,为什么要将两个分段预先形成到同一个地方呢?

1 个答案:

答案 0 :(得分:4)

(1)如果您正在调试优化代码,执行顺序可能很奇怪(但编译器永远不会以改变行为的方式重新排序执行 - 禁止错误)。但由于双重段,这在这里不太可能发挥作用。

(2)删除几个NSLog()语句,看它是否真的被双重执行。

(3)这种事情最常见的原因是线程;运行在此代码路径中的队列中运行的一些代码,然后触发主队列上的更新或某些行为。如果你做NSLog(@"%p", [NSThread currentThread]);那将记录线程的地址。如果在该方法的两种不同执行方式上有所不同,那就是你的问题。

(请注意,当您在调试时“步入”时,应用程序中的其他线程将在该步骤中运行。这是必需的,因为否则很容易死锁。)