gpt4 book ai didi

objective-c - Objective-C 2.0 的内存管理

转载 作者:行者123 更新时间:2023-11-28 18:39:02 25 4
gpt4 key购买 nike

我是 Objective-C 的初学者。我正在通过编写简单的命令行代码来研究 Objective-C 中的内存管理。

我的环境如下。

  • Mac OS X Mountain Lion。
  • Xcode4.5

我在下面写了一段代码。

测试.m

1     #import <Foundation/Foundation.h>
2 #import <stdio.h>
3
4 @interface A : NSObject
5 -(void)myprint;
6 @end
7
8 @implementation A
9 -(void)dealloc {
10 printf("dealloc!!\n");
11 [super dealloc];
12 }
13
14 -(void)myprint {
15 printf("myprint!!\n");
16 }
17 @end
18
19 int main(void) {
20
21 id obj1 = [[[NSObject alloc] init] autorelease];
22 id obj2 = [[A alloc] init];
23
24 [obj2 release];
25 [obj2 myprint];
26
27 return 0;
28 }

我用下面的命令构建了这段代码。(构建没有 ARC 选项)

clang -g -Wall -o main test.m -fno-objc-arc -framework Foundation

构建成功,没有任何警告消息。结果如下。

dealloc!!
myprint!!

我对这个结果有两个问题。

第一个问题是关于自动释放方法。我认为这段代码会引发运行时错误,因为在没有 NSAutoreleasePool 实例的情况下调用 autorelease 方法。为什么此代码不引发运行时错误?

第二个问题是关于 dealloc 方法。obj2 在调用 dealloc 方法后响应 myprint 方法。为什么obj2在调用dealloc方法后响应myprint方法?

谢谢。

最佳答案

First question is about autorelease method. I think this code will raise a runtime error because autorelease method is called with no NSAutoreleasePool instance. why doesn't this code raise a runtime error?

没有自动释放池,因此,我有点惊讶您在运行时没有看到 没有适当的池 警告。不过,这不是错误,只是发生泄漏的运行时警告。

奇怪。我看到了同样的行为。我会问。

Second question is about dealloc method. obj2 responds to myprint method after dealloc method was called. Why does obj2 respond to myprint method after dealloc method was called?

未定义的行为。 obj2已被释放,但释放并不意味着内存已被清除。

如果您打开 Malloc Scribble(在释放时在内存上涂鸦),您将看到预期的崩溃:

env MallocScribble=1 ./main
dealloc!!
Segmentation fault: 11

更好的是,如果你打开僵尸检测:

env NSZombieEnabled=YES ./main
dealloc!!
2012-12-06 08:10:14.580 main[80114:f07] *** -[A myprint]: message sent to deallocated instance 0x7f9b7ac09dd0
Trace/BPT trap: 5

关于objective-c - Objective-C 2.0 的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13737571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com