Foundation アプリの 2 つの Objective-C コードを次に示します。このコードは関数内にあります。
[arrayOfObjects addObject:[[TheShape alloc] init]];
NSLog(@"%@", arrayOfObjects); // log verifies "<TheShape..." is in the array
[arrayOfObjects release];
そして、私の TheShape クラスには、このdealloc
オーバーライド メソッドがあります。
- (void)dealloc {
NSLog(@"TheShape dealloc called.");
[super dealloc];
}
私のプログラムは別の方法では動作しますが、期待どおりには動作しません。メッセージが送信されると、[arrayOfObjects release]
"TheShape dealloc..." という文字列がログに表示されるはずです。そうではありません。
Q1: なぜですか?
だから私は少し掘り下げて物事を単純化します。次のような簡単なことをすると:
TheShape *aShape = [[TheShape alloc] init];
[aShape release];
デバッグ メッセージはまだログに表示されません。
Q2: なぜですか?
しかし、私がこれを行うと:
TheShape *aShape = [TheShape new];
[aShape release];
デバッグ メッセージはログに表示されます。最初のサンプルの alloc/init も に変更すると、デバッグ メッセージもログに表示されますnew
。
Q3: なぜですか?
明らかに、alloc/init/release サイクル (Q の 1 および 2) と、new
およびalloc/init
(Q3) の想定される等価性に概念的な何かが欠けています。私のように、考えるのが難しい人のために、もう少し物事を説明するチュートリアルを教えてもらえますか?
ありがとう、
明細書