1

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

- (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并再次运行。在 if 弄清楚自己之后,iphone 会执行两个 segues 到同一个地方。

我已经截屏了调试,所以你可以准确地看到我在说什么。

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

为什么计算机在代码中跳跃,为什么它会在同一个地方执行两个 segues?

4

1 回答 1

4

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

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

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

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

于 2013-05-26T19:13:14.573 回答