Ответ
dealloc — это метод экземпляра класса в Objective-C, который вызывается автоматически непосредственно перед тем, как память, занятая объектом, будет освобождена. Это финализатор (finalizer).
Ключевые особенности:
- Вызов: Система вызывает
dealloc, когда счетчик ссылок на объект становится равен нулю (в среде ARC — Automatic Reference Counting). - Назначение: Освобождение ресурсов, которые не управляются ARC. Например:
- Отписка от уведомлений (
NSNotificationCenter). - Закрытие файловых дескрипторов или сетевых сокетов.
- Аннулирование таймеров, которые могут удерживать сильные ссылки на объект (
NSTimer). - Освобождение памяти, выделенной вручную (через
malloc,CGFloatи т.д.).
- Отписка от уведомлений (
Важное правило: В среде ARC вызов [super dealloc] запрещен — компилятор сделает это автоматически.
Пример корректной реализации в ARC:
@interface MyClass : NSObject
@property (strong) NSTimer *timer;
@property (assign) FILE *logFile;
@end
@implementation MyClass
- (void)dealloc {
// 1. Остановка и аннулирование таймера
[self.timer invalidate];
// 2. Закрытие файлового дескриптора
if (_logFile) {
fclose(_logFile);
}
// 3. Отписка от уведомлений
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 4. В ARC НЕ вызываем [super dealloc]!
}
@end
Аналог в Swift: В Swift используется метод deinit. Принципы те же — освобождение неуправляемых ресурсов.
deinit {
timer?.invalidate()
NotificationCenter.default.removeObserver(self)
}
Предостережение: Не следует выполнять в dealloc тяжелые или потенциально блокирующие операции, а также обращаться к другим объектам, которые могут быть уже освобождены.