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,它也会捕获这个。
我被程序这样的输出结果搞糊涂了
#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,它也会捕获这个。