Цель C (в общем) не гарантирует, что значения стека обнуляются.Это гарантирует, что все ivars в объекте обнуляются.Кроме того, под ARC он делает переменные с нулевым стеком, которые, как он знает, являются объектами.Таким образом, поведение, которое вы видите, является правильным, если вы не используете ARC.
В общем, даже если вы находитесь в среде, которая обнуляет значение, вы должны явно обнулить его, если ваш код будет повторно использован где-то еще.Если существует ограничение, необходимое для работы вашего кода, вы должны либо выполнить его, либо проверить его во время выполнения, либо проверить его во время компиляции (assert()
).
Что касается того, почему это так, тотак происходит, потому что C ведет себя так, а C традиционно делает это, потому что это чистые металлы и предпочитает, чтобы компилятор имел большую свободу действий для оптимизации производительности.Цель C отличается только в тех местах, где это необходимо для поддержки собственной (дополнительной) функциональности.