Ваш вопрос на самом деле является более общим вопросом, который можно удалить из проблемы dealloc
.
Переопределяющие методы и когда вам нужно вызвать super
.
Иногда, когда вы создаете подклассыВы переопределяете существующий метод.Иногда вы хотите использовать это удобное время для выполнения какого-либо поведения, иногда вы хотите, чтобы родитель не сделал что-то и изменил поведение.
- (void)methodOne {
// don't let silly parent class do method one stuff
// do my stuff …
}
- (void)methodTwo {
// let parent perform his behavior first
[super methodTwo];
// do my stuff …
}
- (void)methodThree {
// do my stuff …
// let parent do his stuff after I have
[super methodThree];
}
- (void)methodFour {
// it's not common, but you might want to split your stuff with a call to
// super - this usually involves knowledge of what super is up to
// do some stuff …
[super methodFour];
// do my stuff …
}
Возможно, документация для многих методов / классов (см. UIView и NSManagedObject)Скажите, можете ли вы или не должны переопределять методы.Хорошая документация скажет вам, когда вы должны вызывать super.
Когда вы вызываете [super dealloc]
, вы должны вызывать его последним, после того, как вы освободили ресурсы, на которых удерживали.(поскольку вполне вероятно, что другая память, на которую вы можете ссылаться, будет освобождена вашим родительским классом).
Другой часто вызываемый super
находится в методах init.Если вы реализуете метод init, вам следует переопределить «назначенный инициализатор» родителя, и вы должны вызывать super из своего.
@implementation CustomViewController
- (id)init {
return [super initWithNibName:@"CustomView" bundle:nil];
}
- (id)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle {
return [self init];
}
//…
Этот общий шаблон не позволяет никому загружать ваш класс с неверным файлом пера.(Это может или не может быть желательным, это другая проблема.)
Если были другие инициализаторы, по определению они должны вызывать назначенный им инициализатор.Поэтому, если бы UIView добавил метод initWithNibName:
, он, скорее всего, вызвал бы [self initWithNibName:name bundle:nil]
, который затем был бы «перехвачен» и перенаправлен на ваш предполагаемый инициализатор.