Зачем сохранять статическую переменную?
разве нет необходимости сохранять статическую переменную, так как она остается на протяжении всей программы, независимо от того, выпускаете ли вы ее?
посмотреть этот код: 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;
и ты молодец.
Примечание: навсегда = в то время как приложение работает