Objective-C 释放消息后对象未被销毁

Objective-C object are not destroyed after release message

我被程序这样的输出结果搞糊涂了

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

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

    [human release];

    [human sayHello];

    return 0;
}

class本身就是

@implementation Human

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

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

@end

结果是Output result

主要问题是为什么方法sayHello被执行,尽管对象本身被销毁了,因为它的保留计数被设置为0通过发送release消息?更重要的是,如果我通过调试器执行程序流程,应用程序将崩溃,因为 human 指针不再是对象。这里发生了什么事?

P.S。 ARC 已关闭

提前致谢。

欢迎来到 C!这里没有保安。

当内存被释放时,编译器和运行时默认情况下不会做任何特殊的事情,除了将内存标记为可供其他东西使用。

内存中的任何内容都会保留在内存中,正如您所发现的,内存仍然可以读取,这可能会导致非常严重的错误。

在 Xcode 中,您可以打开僵尸检测,这会导致工具在运行时突出显示此特定错误。

还有 malloc scribbling/debugging,它也会捕获这个。

看这里:https://developer.apple.com/library/archive/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html