Вы имеете в виду, почему язык не поддерживает многопоточность или почему не делают механизмы JavaScript в браузерах поддерживают многопоточность?
ответ на первый вопрос - то, что JavaScript в браузере предназначен, чтобы быть выполненным в песочнице и способом machine/OS-independent, добавить, что поддержка многопоточности усложнила бы язык и связала бы язык слишком тесно с ОС.
Вы всегда должны освобождать резервные переменные в dealloc:
- (void) dealloc {
[operation release];
[link release];
[super dealloc];
}
Другой способ:
- (void) dealloc {
self.operation = nil;
self.link = nil;
[super dealloc];
}
Это не предпочтительный способ освобождения объекты, но в случае, если вы используете синтезированные поддерживающие переменные , это единственный способ сделать это.
ПРИМЕЧАНИЕ: чтобы прояснить, почему это работает, давайте посмотрим на синтезированную реализацию установщика для свойства link , и что происходит, если для него установлено значение nil :
- (void) setLink:(MyClass *) value {
[value retain]; // calls [nil retain], which does nothing
[link release]; // releases the backing variable (ivar)
link = value; // sets the backing variable (ivar) to nil
}
Таким образом, чистый эффект заключается в том, что он освобождает ivar.
В не-GC приложениях да. Обычно вместо освобождения ivars присваивается nil. Мой лучший опыт - освободить ivars, инициализированные с помощью init, и назначить nil свойствам с режимами сохранения и копирования.
В вашем случае я бы назначил nil
- (void) dealloc {
self.operation = nil;
self.link = nil;
[super dealloc];
}
Лучший способ сделать это:
- (void)dealloc {
[operation release], operation = nil;
[link release], link = nil;
[super dealloc];
}
Действительно, было бы удобнее использовать сгенерированные методы установки
self.operation = nil;
, но это не одобряется. Вы не всегда знаете, в каком потоке освобождается объект. Таким образом, использование средства доступа может вызвать проблемы из-за запуска уведомлений KVO.
Уловка здесь в том, что вам нужно адаптировать свой освобождение для соответствия политике управления объектами, определенной в вашем @property. Например, не выпускайте iVar, поддерживающий свойство (assign).
Нет, вы переопределяете метод -dealloc
. И да, если вы не освободите свои свойства (или, скорее, поддерживающие ivars), у вас будет утечка. Итак, в вашей @implementation здесь должно быть что-то вроде
- (void)dealloc {
[operation release];
[link release];
[super dealloc];
}
При синтезе свойства создаются только методы получения и установки, поэтому ivar не будет освобожден при освобождении объекта. Вам нужно освободить ивар самостоятельно.