newacct が言ったように、自動解放はこの問題から抜け出すための簡単な方法です。ただし、返すオブジェクトの「所有権」を考慮する必要があります。
Objective-C では、一般的な経験則として、名前にalloc
、new
、またはが含まれるメソッドcopy
は、自動解放されないオブジェクトを返しますが、他のメソッド (クラス メソッドなど) は、返されるオブジェクトを事前に自動解放します。したがって、これら 3 つは autorelease に関しては同等ではありません (ただし、コンパイラはいくつかの魔法を実行して、いずれにせよすべてを文字列定数に減らします)。
// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];
// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];
コードは、返されるオブジェクトの所有者を考慮して、同様のアプローチを取ることができます。あなたが提供した特定の例では、メソッドはオブジェクトをalloc
ing およびing するものであるため、一般に、独自のメソッド内で [sic] ing するinit
責任があります。autorelease
ただし、既存のオブジェクトを取得して何らかの方法で変更するメソッドを作成する場合、そのオブジェクトを所有していないため、返されたオブジェクトを自動解放する責任はありません。(そうすると、オブジェクトが属する自動解放プールが空になったときに、実際に問題が発生する可能性があります。)
参照してください (コメントの Peter と Quinn に感謝します!):