0

我被这个程序的输出结果弄糊涂了。

#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 已关闭

提前致谢。

4

1 回答 1

2

欢迎来到C!这里没有安全卫士。

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

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

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

还有 malloc 涂鸦/调试,它也可以捕捉到这一点。

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

于 2018-08-18T18:52:08.633 回答