本では、次のように言われています:
では、オブジェクトがいつ誰によって所有されているかをどうやって知るのでしょうか?次の例を考えてみましょう。
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str;この例では、の
allocキーワードを使用しているためstr、を所有していますstr。したがって、不要になったときにリリースする必要があります。ただし、str2は単にを指してstrいるので、所有していません。つまり、使い終わったときにstr2解放する必要はありません。str2
所有権は変数やポインタではなくオブジェクトによるものだと思ったので、「所有する」strまたは「所有するstr2」とは言えません。それはすべて同じです。strstr2[str release][str2 release]
他の説明は次のとおりです。
たとえば、前のセクションで使用した例を考えてみましょう。
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---
str2自分が所有していないオブジェクトを解放できないため、解放しようとするとランタイムエラーが発生します。
[str2 release]それが前に呼び出されれば、実際に使用できます [str release]。これを行うと、行[str release]とエラーが発生します。これはstr、str2両方ともダングリングポインターであり、おそらくrelease最初にオブジェクトに送信されたときに、参照カウントが0になり、deallocすぐに呼び出され、メモリが解放されたためです。 C関数によるfree()。
上記は正しいですか、それとも他に修正すべきことがありますか?