Освобождает память Объективных-c 2,0 требуемых свойств?

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

ответ на первый вопрос - то, что JavaScript в браузере предназначен, чтобы быть выполненным в песочнице и способом machine/OS-independent, добавить, что поддержка многопоточности усложнила бы язык и связала бы язык слишком тесно с ОС.

8
задан Jacob 7 September 2009 в 12:25
поделиться

5 ответов

Вы всегда должны освобождать резервные переменные в 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.

13
ответ дан 5 December 2019 в 08:24
поделиться

В не-GC приложениях да. Обычно вместо освобождения ivars присваивается nil. Мой лучший опыт - освободить ivars, инициализированные с помощью init, и назначить nil свойствам с режимами сохранения и копирования.

В вашем случае я бы назначил nil

- (void) dealloc {
   self.operation = nil;
   self.link = nil;
   [super dealloc];
}
3
ответ дан 5 December 2019 в 08:24
поделиться

Лучший способ сделать это:

- (void)dealloc {
    [operation release], operation = nil;
    [link release], link = nil;

    [super dealloc];
}

Действительно, было бы удобнее использовать сгенерированные методы установки

self.operation = nil;

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

Уловка здесь в том, что вам нужно адаптировать свой освобождение для соответствия политике управления объектами, определенной в вашем @property. Например, не выпускайте iVar, поддерживающий свойство (assign).

2
ответ дан 5 December 2019 в 08:24
поделиться

Нет, вы переопределяете метод -dealloc . И да, если вы не освободите свои свойства (или, скорее, поддерживающие ivars), у вас будет утечка. Итак, в вашей @implementation здесь должно быть что-то вроде

- (void)dealloc {
    [operation release];
    [link release];
    [super dealloc];
}
1
ответ дан 5 December 2019 в 08:24
поделиться

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

1
ответ дан 5 December 2019 в 08:24
поделиться