我是Objective-C的初学者。我正在通过编写简单的命令行代码来研究 Objective-C 中的内存管理。
我的环境如下。
- Mac OS X 山狮。
- 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 方法。为什么调用dealloc方法后obj2响应myprint方法?
谢谢。