Если Вы устанавливаете делегата в ноле в классе с помощью делегата или в самом классе

1 альтернативный способ сделать:

String b = a + "";
13
задан Quinn Taylor 2 July 2009 в 06:18
поделиться

3 ответа

Да, вы должны установить для свойства делегата классаB значение nil в параметре dealloc классаA.

Это не проблема управления памятью, потому что свойства делегата должны быть помечены как «присваивать, а не сохранять», чтобы избежать циклов сохранения (в противном случае освобождение памяти никогда не будет вызвано). Проблема в том, что в противном случае classB мог бы сообщить classA после того, как он был освобожден.

Например, если classB имеет вызов delagate, чтобы сказать «быть скрытым», а classB освобождается сразу после classA, он будет сообщать об уже освобожденном classA вызывает сбой.

И помните, вы не всегда можете гарантировать порядок освобождения, особенно если они автоматически освобождаются.

Так что да, обнулить свойство делегата в dealloc класса A.

15
ответ дан 1 December 2019 в 20:43
поделиться

Сначала несколько наблюдений ...

  1. Вы забыли вызвать [super dealloc] в конце вашего собственного метода dealloc.
  2. Поскольку 'a' создал 'b', и если ни один другой объект не сохранил 'b', нет смысла обнулять делегат в -dealloc , так как 'b' все равно вот-вот будет уничтожен. Если возможно, что другие объекты имеют ссылку на 'b' (что означает, что он может пережить 'a'), тогда установите для делегата значение nil.
  3. Объект 'b' должен заботиться о своем делегате самостоятельно - dealloc при необходимости . (Обычно делегатор не сохраняет делегата.)
  4. Избегайте использования свойств в методах -init ... и -dealloc - Apple не одобряет этого, и не зря. (Это могло не только иметь неожиданные побочные эффекты, но может также вызвать более неприятные, более серьезные проблемы.)
  5. Использование свойств (через точечный синтаксис), когда вам не нужно незаметно, добавляет дополнительную работу. Например, self.b.delegate = self эквивалентно [[self getB] setDelegate: self] - это просто синтаксический сахар, из-за которого создается впечатление, что вы получаете доступ к ivar напрямую, но на самом деле это не так.
  6. Использование свойств без понимания того, что они делают, может привести к проблемам. Если self.b сохраняет значение (для свойства установлено значение «assign»), у вас в руках утечка памяти.

Вот как я, вероятно, написал бы это:

- (void) someFunc {
  b = [[B alloc] init];
  b.delegate = self; // or [b setDelegate:self];
}

- (void) dealloc {
  b.delegate = nil;
  [b release];
  [super dealloc];
}
5
ответ дан 1 December 2019 в 20:43
поделиться

Насколько мне известно, лучше всего (назначить) делегата, чтобы вы избегали циклических ссылок на счетчик удержания для ситуаций, подобных этой. Если вы настроили свойство правильно, то есть:

@property (assign) id<BDelegate> delegate;

Вам не нужно выполнять какое-либо управление памятью в dealloc, так как счетчик сохранения не увеличивается при вызове self.b.delegate = self; - в отличие от использования (сохранить) или (скопировать)

Имеет смысл? Было бы хорошо установить делегата равным нулю, но какой в ​​этом смысл?

9
ответ дан 1 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: