2

これがサンプルコードで、「文字列」オブジェクトのみがリリースされています。

NSString *nameOfFile = ... ;
NSError *error;
NSString *string = [[NSString alloc] initWithContentsOfFile:nameOfFile encoding:NSUTF8StringEncoding error:&error];
if (string == nil) {
    // handle error
}
[string release];

エラーオブジェクトが解放されない理由を理解しました。これは、ここのメソッドが「new」または「alloc」メソッドでそのエラーオブジェクトを作成しなかったためです。代わりに、これは参照によって返されるため、initWithContentsOfFileメソッドがそのメモリを担当します。しかし、nameOfFileオブジェクトはどうですか?なぜ彼らはそれを解放しないのですか?参照で返されません...?

4

2 に答える 2

6

リリースする必要がない理由と同様に、リリースするerror必要もありませんnameOfFileNSString *temp = @"Hello"Objective-Cでは、文字列定数として扱われ、解放する必要がないため、文字列を宣言した場合。メモリ参照カウントはゼロであるため、解放する必要はありません。

于 2009-04-25T21:32:12.850 に答える
4

が定数nameOfFile文字列であるとすると、保持カウントは自動的に7fffffff(つまり2147483647、可能な最大の保持カウント)になります。基本的に、文字列リテラルは実行中存続し、割り当てが解除されることはないため、解放することを心配する必要はありません。

オブジェクトを保持するか、明示的にメモリを割り当てた場合にのみ、オブジェクトを解放する必要があることを忘れないでください。

詳細については、 Appleのドキュメントを参照してください。

于 2009-04-25T21:47:03.627 に答える