Зачем сохранять статическую переменную?

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

посмотреть этот код: https://github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29

2 ответов


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

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

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


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

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

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

static ThatClass * __strong thatStaticVariable;

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

static ThatClass *thatStaticVariable;

и ты молодец.

Примечание: навсегда = в то время как приложение работает