私はObjective-Cの初心者です。簡単なコマンドラインコードを書いて、Objective-Cのメモリ管理を勉強しています。
私の環境は以下の通りです。
- MacOSXマウンテンライオン。
- Xcode4.5
以下にコードを書きました。
test.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!!
この結果について2つの質問があります。
最初の質問は自動解放方法についてです。このコードでは、NSAutoreleasePoolインスタンスなしでautoreleaseメソッドが呼び出されるため、ランタイムエラーが発生すると思います。このコードでランタイムエラーが発生しないのはなぜですか?
2番目の質問はdeallocメソッドについてです。obj2は、deallocメソッドが呼び出された後にmyprintメソッドに応答します。obj2がdeallocメソッドが呼び出された後にmyprintメソッドに応答するのはなぜですか?
ありがとう。