Что такое метод dealloc в Objective-C?

«Что такое метод dealloc в Objective-C?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 тяжелые или потенциально блокирующие операции, а также обращаться к другим объектам, которые могут быть уже освобождены.