При объявлении объектов в Какао я должен установить их на ноль? - PullRequest
3 голосов
/ 11 августа 2009

Скажем, я хочу создать экземпляр NSString, который инициализируется определенным значением в зависимости от значения другой переменной. Обычно я бы сделал

NSString *string;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";

Однако в некотором примере кода, который я видел, я видел, как люди делают

NSString *string = nil;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";

В чем разница между этими двумя и какой метод предпочтительнее?

Ответы [ 4 ]

6 голосов
/ 11 августа 2009

Мое личное предпочтение - немедленно инициализировать любую переменную. Однако в приведенном вами примере эти два метода эквивалентны.

В C языках (т. Е. C, C++, Obj-C) переменные, которые не инициализируются немедленно, могут содержать случайные значения мусора. Использование переменной до ее инициализации приводит к непредвиденному поведению (от надежного сбоя до неожиданного поведения).

Пример Рассмотрим следующий пример:

int abs;
if (argument > 0) abs = argument;
else if (argument < 0) abs = -1 * argument;
NSLog(@"%i", abs);

Здесь код оставляет переменную abs неинициализированной, если argument равно 0. Таким образом, вы бы регистрировали случайные значения, а затем приводили к искажению значений в остальной части программы; и было бы трудно определить, где проблема!

Если вы используете неинициализированную ссылку, вы, скорее всего, получите EXC_BAD_ACCESS.

2 голосов
/ 12 августа 2009

Назначение для nil существует, так что никто никогда не смотрит на код и не беспокоится о том, что переменная когда-либо находится в неопределенном состоянии.

NSString *string;
NSLog(@"%p", string);

Этот код напечатает значение мусора, так как значение строки не определено.

Вместо того, чтобы писать код, как в вашем примере, я предпочитаю использовать оператор троичный . Вот пример:

NSString *string = (foo == 1) ? @"Foo is one." : @"Foo is not one.";

Теперь значение строки всегда определяется. Если выражения усложняются, а строка становится длинной, просто используйте промежуточные переменные.

Лучшее решение многих проблем - просто устранить проблему. Это делает именно это.

1 голос
/ 11 августа 2009

Установка переменных в значение или в ноль может упростить обнаружение ошибки неинициализированного значения во время выполнения.

NSString *string = @"Foo is not one";
if(foo == 1)
    string = @"Foo is one.";

В наши дни различные компиляторы лучше распознают неинициализированные значения.

Одной из причин C для установки указателей на ноль (после последнего использования) является сборка мусора.

0 голосов
/ 11 августа 2009

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

NSError *error = nil;
[SomeCocoaClass performOperationWithObject:obj error:&error];
if(nil != error){
//handle error
}

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

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