私はObjective-Cの理解を固めるためにいくつかの探索的コードを書いていましたが、私はこの例に出くわしましたが、私は完全には理解していません。このメソッドを定義し、コードを実行します。
- (NSString *)stringMethod
{
NSString *stringPointer = [[NSString alloc] initWithFormat:@"string inside stringPointer"];
[stringPointer release];
[stringPointer release];
NSLog(@"retain count of stringPointer is %i", [stringPointer retainCount]);
return stringPointer;
}
コードを実行してこのメソッドを呼び出した後、いくつかのことに気付きました。
通常、保持カウントがゼロになった後に割り当てが解除されたと思われるものにアクセスしようとすると、EXC_BAD_ACCESSエラーが発生します。ここでは、代わりにmallocの「ダブルフリー」エラーが発生します。何故ですか?
コードに「[stringPointerrelease]」の行数を追加しても、NSLogは保持カウント1を報告します。リリースを追加すると、「ダブルフリー」エラーが増えるだけです。リリースステートメントが期待どおりに機能しないのはなぜですか?
stringPointerをオーバーリリースし、「ダブルフリー」エラーをたくさん受け取りましたが、戻り値は何も起こらなかったかのように機能します(戻り値を報告する別のNSLogがメインコードにあります)。プログラムは引き続き正常に実行されます。繰り返しますが、なぜこれが起こるのか誰かが説明できますか?
これらの例はかなり些細なことですが、私は何が起こっているのかを完全に把握しようとしています。ありがとう!