Ответ 1

Я предполагаю, что вы имеете в виду статический указатель объекта, например static NSString *foobar;.

Такие переменные действительно имеют продолжительность жизни, пока приложение, но переменные, о которых мы говорим, являются указателями. В Objective-C объекты всегда динамически распределяются, поэтому мы всегда обращаемся к ним с указателем на их тип, но базовые данные для объекта все еще присутствуют в динамически выделенном синем синем.

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

Ответ 2

Упрощенная версия Джонатана Гринсвана приняла ответ:

retain не для переменной, которая указывает на объект. Эта переменная будет длиться вечно, потому что она статична. retain предназначен для объекта, на который указывает переменная. Без retain объект может (и должен) быть освобожден. Тогда у вас есть переменная, указывающая на вещь, которая вызовет sigabrt. Эта переменная, указывающая нигде, не известна как "оборванный указатель".

Для контекста ARC лучше всего будет объявить статическую переменную такой же сильной, что-то вроде этого:

static ThatClass * __strong thatStaticVariable;

Это гарантирует, что объект, на который указывает thatStaticVariable, будет действительным объектом (т.е. никогда не будет освобожден) после назначения. Однако вам действительно не нужно ключевое слово __strong, потому что оно по умолчанию (так говорит документы, благодаря @zpasternack ), поэтому просто используйте

static ThatClass *thatStaticVariable;

и вы хорошо.

Примечание: forever = во время работы приложения