gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:54:39 24 4
gpt4 key购买 nike

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

- (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 会执行两次转至同一个位置。

我对调试进行了屏幕截图,以便您可以准确地看到我在说什么。

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

为什么计算机会跳过代码,为什么它会执行两次转至同一个地方?

最佳答案

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

(2) 插入几个 NSLog() 语句以查看它是否确实被双重执行。

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

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

关于ios - XCode 调试器意外切换当前执行行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16762646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com