В этом случае вы не можете по-настоящему освободить объект, так как это статическая строка, которая находится в секции только для чтения вашей программы, которая отображается в памяти.Выполнение [@"foo" release]
не имеет никакого эффекта.Вы можете назначить nil
только для вашей переменной, но это не заставит строку исчезнуть.
В общем, смысл статической переменной в том, чтобы остаться, чтобы вы не хотели ее освобождать.,Пока это не изменяемый массив, который только растет и занимает огромные части памяти, это не проблема.
Изменить, чтобы уточнить:
Обычно выиспользуйте статическую переменную для выделения чего-то, что должно быть более или менее статичным один раз.Статическая переменная используется совместно со всеми экземплярами , поэтому, если вы ее измените, все экземпляры вашего класса увидят это изменение.Особенно с несколькими потоками это может быть проблемой, но обычно это безопасно сделать:
- (void)foo
{
// It's important to initialize this to nil. This initialization
// is only done ONCE on application start ! It will NOT overwrite
// any values you've set later on.
static NSDate *someImportantDate = nil;
if (!someImportantDate) {
// Allocate the static object. We will only get here once.
// You need to make sure that the object here is not autoreleased !
someImportantDate = [[NSDate alloc] init];
// or:
someImportantDate = [[NSDate date] retain];
}
// Do stuff.
}
Но после создания вам не нужно больше трогать статическую переменную.Если вы обнаружите необходимость изменить его, вы должны использовать переменную экземпляра в своем классе вместо статической переменной.
Также предупреждение о многопоточности: если у вас несколько потоков, вы должны убедиться, что инициализациястатическая переменная выполняется до того, как несколько потоков могут получить к ней доступ.Потому что, если каждый из двух потоков увидит неинициализированную (nil) переменную, они оба попытаются установить новое значение (состояние гонки), которое теоретически может даже привести к сбою.Как только переменная инициализирована и вы только читаете переменную (и это не изменяемый объект), можно безопасно получить доступ к значению из разных потоков.