4

わかりました、この質問に対する答えは明白であることはわかっていますが、正しい方向に少しプッシュする必要があります。

私は、次のパターンに従うかなりの数のメソッドを書いていることに気づきました。

-(NSThing*)myMethod{

  NSThing *thing = [[NSthing alloc] init];
  // do some stuff with the thing
  return thing;
}

私の質問は、このオブジェクトのリリースをどのように処理すればよいですか? 明らかに、メソッド内でそれを解放することはできません。

4

2 に答える 2

13

通常、あなたはそれを自動解放します

-(NSThing*)myMethod{

  NSThing *thing = [[NSthing alloc] init];
  // do some stuff with the thing
  return [thing autorelease];
}
于 2009-08-09T04:47:41.273 に答える
5

newacct が言ったように、自動解放はこの問題から抜け出すための簡単な方法です。ただし、返すオブジェクトの「所有権」を考慮する必要があります。

Objective-C では、一般的な経験則として、名前にallocnew、またはが含まれるメソッドcopyは、自動解放されないオブジェクトを返しますが、他のメソッド (クラス メソッドなど) は、返されるオブジェクトを事前に自動解放します。したがって、これら 3 つは autorelease に関しては同等ではありません (ただし、コンパイラはいくつかの魔法を実行して、いずれにせよすべてを文字列定数に減らします)。

// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];

// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];

コードは、返されるオブジェクトの所有者を考慮して、同様のアプローチを取ることができます。あなたが提供した特定の例では、メソッドはオブジェクトをallocing およびing するものであるため、一般に、独自のメソッド内で [sic] ing するinit責任があります。autoreleaseただし、既存のオブジェクトを取得して何らかの方法で変更するメソッドを作成する場合、そのオブジェクトを所有していないため、返されたオブジェクトを自動解放する責任はありません。(そうすると、オブジェクトが属する自動解放プールが空になったときに、実際に問題が発生する可能性があります。)

参照してください (コメントの Peter と Quinn に感謝します!):

于 2009-08-09T05:06:28.647 に答える