Это хорошая практика для инициализации переменной в ноль? - PullRequest
5 голосов
/ 09 февраля 2012

Это хорошая практика, чтобы инициализировать переменную nil?

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

 NSString *q;

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        sqlite3_step(statement);
        selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)];
        sqlite3_finalize(statement);
    }

    sqlite3_close(database);

    return q; //Undefined or garbage value returned to caller

Когда я меняю код, предупреждение исчезает:

NSString *q = nil;

Ответы [ 4 ]

11 голосов
/ 09 февраля 2012

Если вы используете ARC, то ваши указатели будут автоматически назначены на ноль. Однако я не верю, что вы используете ARC, и в этом случае указатель будет иметь значение мусора. Это опасно, потому что тот, кто вызвал функцию, может получить результат и поверить, что указатель указывает на что-то допустимое, поскольку оно не равно нулю.

Итак ... Да, всегда инициализируйте ваши указатели равными нулю или действительному значению.

Пример 1 :: Хороший пример, когда присвоение nil first не обязательно:

UIViewController *myVC = [[[UIViewController] alloc] init] autorelease];

Пример 2 :: Неверный пример, когда присваивание nil первым не обязательно:

UIViewController *myVC = nil;  // dumb since next line assigns it to valid value
myVC = [[[UIViewController] alloc] init] autorelease];

Пример 3 :: Хороший пример присвоения nil, поскольку он условно получит новое значение

UIViewController *myVC = nil;  // :D
if (someCondition)
{
   myVC = [[[UIViewController] alloc] init] autorelease];
}
...
5 голосов
/ 09 февраля 2012

Да. Если q не инициализируется значением nil, оно будет иметь случайное значение, которое может привести к скрытым ошибкам при последующем выполнении.

0 голосов
/ 15 июля 2014

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

Хороший компилятор скажет вам, используете ли вы переменную, которая не была определена до ее использования, или если компилятор не может доказать, что она определена до ее использования.Плохой компилятор (или хороший компилятор, используемый разработчиком, который не знает, как правильно использовать свои инструменты), этого не сделает.При хорошем компиляторе инициализация в nil или NULL может помешать компилятору правильно выполнять свою работу.Рассмотрим этот пример, где вы действительно хотите, чтобы код возвращал строку NSString, которая не равна nil, но не поняла его правильно:

NSString* result;
if (condition) result = @"True";
else if (otherCondition) result = @"False";
return result;

Здесь компилятор может предупредить вас, поскольку вы можете вернуть неопределенный результат.Если вы инициализируете результат в nil, у вас все равно будет та же проблема, что вы можете вернуть nil в функции, которая не должна возвращать nil, но компилятор не может вас предупредить.

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

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

0 голосов
/ 09 февраля 2012

Да, это прекрасно.Nil - это просто еще один способ сказать, что эта переменная не указывает ни на что в памяти.

...