あなたがしたことはうまくいくでしょう。retain
すべてが均等になる限り、選択した任意のスコープからオブジェクトを取得できrelease
ます (そして、オブジェクトが他のオブジェクトで不要になったときにオブジェクトの割り当てが解除されます)。
しかし、あなたがしていることは慣習的ではありません。オブジェクトがメソッドの存続期間を過ぎても存続できるようにする場合 (return
メソッドの呼び出し元がオブジェクトを取得できるようにするため)、 を使用する必要がありますautorelease
。
あなたの例では、最初のメソッドはおそらく文字列の所有権を保持すべきではありません。それを解放し、発信者がそれを拾うことができるようにする必要があります。ただし、もちろん、release
メソッドでそれを行うと、すぐに割り当てが解除されます。代わりに、それを行うことができautorelease
ます。それを自動解放することにより、最初の方法は「このオブジェクトは不要になり、所有権を放棄しますが、必要に応じて呼び出し元が保持できるように、もう少しの間メモリに保持してください」と言います。
次に例を示します。
- (NSString *)createString {
/* Create a string. This method owns it. */
NSString *str = [[NSString alloc] init];
/* Autorelease it. This method does not own it, but wants it to stay in memory temporarily. */
[str autorelease]
/* Return it. It will stay in memory till the end of the current run loop */
return str;
}
- (void)viewDidLoad{
NSString *name = [self createString];
/* We now have a copy of the string. Nobody owns it. */
/* It is due to be released at the end of the current run loop. */
/* If we want to take ownership of it and prevent deallocation, we should retain it. */
[name retain];
}
この動作は、Cocoa API 全体で使用されます。新しいオブジェクトを返すクラス メソッドが表示されると、そのオブジェクトは自動解放されます。たとえば、呼び出す[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]
ときは、NSArray クラスに配列を作成するように依頼しています。arrayWithObjects:
自動解放ステータスのおかげで、メソッドの外部に存在する場合。そうしないretain
と、現在の実行ループの最後に解放されます。