Объект Objective-C не уничтожается после сообщения о выпуске

Меня смутил такой выходной результат этой программы.

#import <Foundation/Foundation.h>
#import "Human.h"

int main(int argc, const char * argv[]) {
    Human *human = [Human new];

    [human release];

    [human sayHello];

    return 0;
}

Сам класс

@implementation Human

-(void)sayHello {
    NSLog(@"Hello");
}

-(void)dealloc {
    NSLog(@"Deallocated");
   [super dealloc];
}

@end

Результат - результат вывода

Главный вопрос - почему метод sayHello был выполнен, хотя сам объект был уничтожен, поскольку его счетчик сохранения был установлен в 0 отправив release сообщение? Что еще более важно, если я пройду через программу через отладчик, произойдет сбой приложения. human Указатель больше не является объектом. Что тут происходит?

PS ARC выключен

Заранее спасибо.

1 ответ

Решение

Добро пожаловать в C! Здесь нет охранников.

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

Все, что находится в памяти, остается в памяти, и, как вы обнаружили, указанная память все еще может быть считана, и это может привести к очень неприятным ошибкам.

В XCode, вы можете включить обнаружение зомби, которое заставило бы эту специфическую ошибку быть выделенной во время выполнения инструментами.

Существует также блокировка / отладка malloc, которая также поймает это.

Смотрите здесь: https://developer.apple.com/library/archive/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html

Другие вопросы по тегам