Детали памяти Objective-C - PullRequest
       24

Детали памяти Objective-C

1 голос
/ 21 ноября 2011

в моей программе target-c (или, может быть, в утилите отладки) я получаю странное поведение.
Я определил, но не выделил или инициализировал 4 экземпляра некоторого класса (пусть это будет «Прямоугольник»):
Rectangle *left, *right, *bottom, *upper;

Сразу после этой строки я ожидаю, что для всех моих четырех объектов будут нулевые указатели (отладка в XCode), но для одного из них (конкретно «верхнего») существует указатель на некоторую ячейку памяти, и его свойства инициализируются со случайными значениями.
Это нормальное поведение? Если это так, пожалуйста, объясните мне, почему. (Я немного новичок в Objective-C программирования)

Ответы [ 4 ]

5 голосов
/ 21 ноября 2011

Цель C (в общем) не гарантирует, что значения стека обнуляются.Это гарантирует, что все ivars в объекте обнуляются.Кроме того, под ARC он делает переменные с нулевым стеком, которые, как он знает, являются объектами.Таким образом, поведение, которое вы видите, является правильным, если вы не используете ARC.

В общем, даже если вы находитесь в среде, которая обнуляет значение, вы должны явно обнулить его, если ваш код будет повторно использован где-то еще.Если существует ограничение, необходимое для работы вашего кода, вы должны либо выполнить его, либо проверить его во время выполнения, либо проверить его во время компиляции (assert()).

Что касается того, почему это так, тотак происходит, потому что C ведет себя так, а C традиционно делает это, потому что это чистые металлы и предпочитает, чтобы компилятор имел большую свободу действий для оптимизации производительности.Цель C отличается только в тех местах, где это необходимо для поддержки собственной (дополнительной) функциональности.

2 голосов
/ 21 ноября 2011

Pro-tip: Никогда не принимайте ничего. Хорошей практикой является инициализация всех ваших переменных известным значением; в этом случае nil.

Если вы пришли из другого языка высокого уровня, который инициализирует переменные для вас, ну ... это не тот язык. : -)

0 голосов
/ 22 ноября 2011

Используйте ARC, это удивительно, так как управление памятью больше не выполняется вами!

0 голосов
/ 21 ноября 2011

Ты должен сделать это ...

Rectangle *left = nil;
Rectangle *right = nil;
Rectangle *bottom = nil;
Rectangle *upper = nil;

, что совпадает с

Rectangle *left = nil, *right = nil, *bottom = nil, *upper = nil;
...