Объект 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