本では、次のように言われています:
では、オブジェクトがいつ誰によって所有されているかをどうやって知るのでしょうか?次の例を考えてみましょう。
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str;
この例では、の
alloc
キーワードを使用しているためstr
、を所有していますstr
。したがって、不要になったときにリリースする必要があります。ただし、str2
は単にを指してstr
いるので、所有していません。つまり、使い終わったときにstr2
解放する必要はありません。str2
所有権は変数やポインタではなくオブジェクトによるものだと思ったので、「所有する」str
または「所有するstr2
」とは言えません。それはすべて同じです。str
str2
[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()
。
上記は正しいですか、それとも他に修正すべきことがありますか?