1 альтернативный способ сделать:
String b = a + "";
Да, вы должны установить для свойства делегата классаB значение nil в параметре dealloc классаA.
Это не проблема управления памятью, потому что свойства делегата должны быть помечены как «присваивать, а не сохранять», чтобы избежать циклов сохранения (в противном случае освобождение памяти никогда не будет вызвано). Проблема в том, что в противном случае classB мог бы сообщить classA после того, как он был освобожден.
Например, если classB имеет вызов delagate, чтобы сказать «быть скрытым», а classB освобождается сразу после classA, он будет сообщать об уже освобожденном classA вызывает сбой.
И помните, вы не всегда можете гарантировать порядок освобождения, особенно если они автоматически освобождаются.
Так что да, обнулить свойство делегата в dealloc класса A.
Сначала несколько наблюдений ...
[super dealloc]
в конце вашего собственного метода dealloc. -dealloc
, так как 'b' все равно вот-вот будет уничтожен. Если возможно, что другие объекты имеют ссылку на 'b' (что означает, что он может пережить 'a'), тогда установите для делегата значение nil. self.b.delegate = self
эквивалентно [[self getB] setDelegate: self]
- это просто синтаксический сахар, из-за которого создается впечатление, что вы получаете доступ к ivar напрямую, но на самом деле это не так. 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];
}
Насколько мне известно, лучше всего (назначить) делегата, чтобы вы избегали циклических ссылок на счетчик удержания для ситуаций, подобных этой. Если вы настроили свойство правильно, то есть:
@property (assign) id<BDelegate> delegate;
Вам не нужно выполнять какое-либо управление памятью в dealloc, так как счетчик сохранения не увеличивается при вызове self.b.delegate = self; - в отличие от использования (сохранить) или (скопировать)
Имеет смысл? Было бы хорошо установить делегата равным нулю, но какой в этом смысл?