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];
}

コードは最後から 3 行目 ( ) まで正常に実行され、NSIndexPath* indexPathジャンプしint segueid = 0て再度実行されます。その後、iPhone は同じ場所への 2 つのセグエを実行します。

私が話していることを正確に見ることができるように、デバッグをスクリーンキャプチャしました。

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

コンピューターがコードを飛び回るのはなぜですか? また、同じ場所で 2 つのセグエを実行するのはなぜですか?

4

1 に答える 1

4

(1) 最適化されたコードをデバッグしている場合、実行順序がおかしくなることがあります (ただし、コンパイラは動作を変更するような方法で実行順序を変更することはありません (バグがなければ))。しかし、ダブル セグエがあるため、ここではその可能性は低いです。

(2) 2 つの NSLog() ステートメントをドロップして、実際に二重に実行されているかどうかを確認します。

(3) この種の最も一般的な原因はスレッド化です。このコード パスを介して実行されるキューで実行される一部のコードは、メイン キューで更新または何らかの動作をトリガーします。これを行うNSLog(@"%p", [NSThread currentThread]);と、スレッドのアドレスがログに記録されます。そのメソッドの 2 つの異なる実行で異なる場合は、問題があります。

(デバッグ中に「ステップ」すると、アプリ内の他のスレッドがステップ中に実行されることに注意してください。そうしないとデッドロックが簡単に発生するため、これは必須です。)

于 2013-05-26T19:13:14.573 に答える