Ответ 1
Это артефакт отладки оптимизированного кода. Когда оптимизация компилятора включена в ваших настройках сборки, она перемещает переменные между памятью и регистрами, как она решает лучше всего. В тот момент, когда вы изучаете переменную в lldb, она может отсутствовать в регистрах или в памяти вообще - хотя она выглядит так, будто она все еще доступна для отображения.
Возможно, это недостаток отладочной информации, выводимой компилятором. Иногда компилятор копирует переменную в регистр для ее использования и только перечисляет это место регистрации в отладочной информации. Позже регистр перераспределяется для других целей; значение все еще присутствует в стеке, но компилятор не сказал отладчику, что это значение можно найти там.
Единственный способ действительно определить, недостаточно ли он отладочная информация или если значение действительно не существует в этой конкретной инструкции, - это проверить код сборки вручную. Как только вы включаете оптимизацию с компилятором, исходный код становится слабым представлением о том, что фактически выполняется в любом конкретном порядке.
Вместо того, чтобы слишком далеко перемещаться в сумасшедший мир оптимизированной отладки кода, я настоятельно рекомендую отключить оптимизацию (уровень оптимизации в настройках сборки) для вашей сборки и отлаживать ее таким образом, если это вообще возможно. Если вам нужно отлаживать приложение с оптимизацией, убедитесь, что вы создаете последний компилятор Apple LLVM, поддерживаемый вашим Xcode, - всегда выполняется работа по оптимизации оптимизированной отладки кода, и вы хотите воспользоваться наиболее доступных на сегодняшний день.