Указатель против нулевого инициализированного указателя - PullRequest
2 голосов
/ 07 января 2011

просто пытается немного лучше понять ObjectiveC.

Разве эти два выражения не должны совпадать?

NSString *str; //address of str is 0x438a5625
NSString *str=nil; //address of str is 0x0

В чем причина такого поведения?

Ответы [ 3 ]

9 голосов
/ 07 января 2011

В C и, следовательно, в Objective C переменные не инициализируются автоматически; скорее, вам просто назначена память, и очистка (при необходимости) становится вашей обязанностью.

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

Никогда не предполагайте, что неинициализированная память фактически может использоваться для чего-либо кроме присвоения значения!

Как порядок, в обоих случаях вы говорите «адрес», когда вы действительно имеете в виду «значение».

3 голосов
/ 07 января 2011

Результат для второго выражения равен nil == 0x0, поэтому значение str равно 0x0. Первое выражение, как правило, имеет неопределенное значение (значение может иметь любое значение). Какое значение имеет неинициализированная переменная, зависит от компилятора. Некоторые компиляторы устанавливают неинициализированные переменные в 0 (0x0), но это не всегда так. В общем, компиляторы не будут устанавливать значение на что-либо, а переменная будет содержать любое значение, которое вы получили.

Особенности компилятора Objective-C в iOS SDK не очень актуальны. Рекомендуется не предполагать, что переменные получают начальное значение по умолчанию. Поэтому вторая строка - гораздо лучший способ инициализации переменной, которую вы не планируете использовать сразу. В противном случае вы можете столкнуться с неожиданным поведением по дороге, когда вы меняете компилятор, когда меняется компилятор или когда ваша переменная инициализируется другим значением.

1 голос
/ 07 января 2011

В C переменные, выделенные в стеке, по умолчанию не инициализируются нулевыми байтами, тогда как глобальные и объекты Objective C (выделенные с помощью alloc) имеют значение.

Я полагаю, что это проблема производительности, и о ней предупреждают всего лишьо каждом учебнике по Си и производным языкам.Компилятор также должен предупредить вас, если вы ссылаетесь на локальную переменную без предварительного присвоения ей значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...