Порядок вычисления аргументов функции или метода не определен и определяется компилятором.Это означает, что нет никакой гарантии, что первое число будет создано до второго, и оно унаследовано target-c от c.Похоже, что на iPad они выполняются в том же порядке, что и в коде, но для симулятора они создаются в обратном порядке.Это порядок событий:
iPad:
- Оценить первый аргумент.Это метод.Его аргументы должны быть обработаны:
- Аргументом является переменная
a
.Используйте его текущее значение (0).
- Оцените второй аргумент.Это постоянная строка.Загрузите его адрес.
- Оцените третий аргумент.Это метод.Его аргументы должны быть обработаны:
- Аргумент является выражением:
a += 1
.Увеличьте a
и верните новое значение (1).
- Оцените четвертый аргумент.Это постоянная строка.Загрузите его адрес.
- Оцените пятый аргумент.Это метод.Его аргументы должны быть обработаны:
- Аргумент является выражением:
a += 1
.Увеличьте a
и верните его новое значение (2).
- Оцените шестой аргумент.Это постоянная строка.Загрузите его адрес.
Симулятор:
- Оцените шестой аргумент.Это постоянная строка.Загрузите его адрес.
- Оцените пятый аргумент.Это метод.Его аргументы должны быть обработаны:
- Аргумент является выражением:
a += 1
.Увеличьте a
и верните его новое значение (1).
- Оцените четвертый аргумент.Это постоянная строка.Загрузите его адрес.
- Оцените третий аргумент.Это метод.Его аргументы должны быть обработаны:
- Аргумент является выражением:
a += 1
.Увеличьте a
и верните его новое значение (2).
- Оцените второй аргумент.Это постоянная строка.Загрузите его адрес.
- Оцените первый аргумент.Это метод.Его аргументы должны быть обработаны:
- Аргументом является переменная
a
.Используйте его текущее значение (2).
Поскольку соглашение о вызовах i386, которое используется симулятором, заключается в том, что аргументы передаются в стек в обратном порядке, япредположил бы, что именно поэтому компилятор оценивает их в обратном порядке.
Чтобы исправить ваши проблемы, вы должны создать объекты NSNumber перед созданием словаря, заставляя компилятор использовать нужный вам порядок.
int a = 0;
NSNumber *numA = [[NSNumber alloc] initWithInt:a];
a += 1;
NSNumber *numB = [[NSNumber alloc] initWithInt:a];
a += 1;
NSNumber *numC = [[NSNumber alloc] initWithInt:a];
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:numA, @"A", numB ,@"B", numC, @"C", nil];
[numA release];
[numB release];
[numC release];
NSLog(@"%@", d);