target-c: инициализировать переменную в ноль - PullRequest
3 голосов
/ 15 декабря 2009

Кто-нибудь знает, может ли быть проблематичен следующий код:

NSString *addchar = nil;

if (case1)
addChar = [[firstname substringToIndex:1] capitalizedString];
else
addChar = [[fullname substringToIndex:1] capitalizedString];

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

NSString *addChar;

и

NSString *addChar = nil;

Спасибо.

Ответы [ 5 ]

7 голосов
/ 15 декабря 2009

Любая форма вполне приемлема. Проблема у вас в другом месте. Я рекомендую выполнить некоторое профилирование кода с помощью инструментов, чтобы выяснить, где возникает эта проблема.

5 голосов
/ 15 декабря 2009

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

Тем не менее, поскольку обе ветви вашего оператора if перекрывают любое предыдущее значение addChar, не должно быть ни одного случая, в котором вы можете увидеть недопустимое значение. Но, безусловно, ничего не мешает явно инициализировать в nil, и если будущий сопровождающий придет и изменит пути кода, вы можете обнаружить, что инициализатор спасает вас!

2 голосов
/ 15 декабря 2009

Вы должны всегда инициализировать в nil, если переменная не инициализирована иначе.

Вы можете отправлять сообщения на ноль, они будут игнорироваться.

NSString * str = nil;
NSLog(@"%@", [str description]);

Выходы:

2009-12-15 08:59:03.352 x[11775] (nil)

Конечно, мне не нужно явно звонить description, я просто демонстрирую вызов nil.

1 голос
/ 15 декабря 2009

Здесь нет никакой разницы, поскольку вы не читаете addChar в своем коде. Более того, компилятор может иногда инициализировать addChar для nil для вас, если вы не сделаете это явно (в зависимости от объема объявления addChar).

См. Связанный вопрос на этом месте .

0 голосов
/ 07 мая 2014

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

https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW5

Кроме того, с незапамятных времен переменные экземпляра инициализируются нулями:

Переменные экземпляра по умолчанию имеют значение nil в Objective-C?

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