2009-08-09 12 views
4

私はこの質問に対する答えが分かりやすいはずですが、私は正しい方向に少し押してください。どのように私は、このオブジェクトの解放を扱うか、メソッドから返されたオブジェクトを解放する

-(NSThing*)myMethod{ 

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

私の質問は次のとおりです。

は、私は自分自身には、次のパターンに従う方法のかなりの数を書いて見つけますか?明らかに私はメソッド内でそれを解放することはできません。 newacctが言ったように

答えて

13

通常、あなたが

-(NSThing*)myMethod{ 

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

こんにちは、{NSThing * thing = [[NSthing alloc] init] autorelease];返すもの;}ここではどうしたらいいですか? – onlinenaman

+1

@onlinenaman:yes – newacct

5

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

Objective-Cで

は、一般的な経験則は、その名前にallocnew、又はcopyとの任意の方法は、自動解放されていないオブジェクトを返すことがあり、一方(クラスメソッドのような)他の方法にプリ自動解放オブジェクト返される。 (コンパイラは、いくつかの魔法を行うと、とにかく文字列定数にそれらすべてを減らすかもしれないが)ので、これらの3つの自動解放の面で等価ではありません。

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

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

あなたがオブジェクトの所有者を考慮し、同様のアプローチを取ることができ、あなたのコードあなたは戻ってきます。あなたが指定した特定の例では、メソッドはオブジェクトであるallocinitです。したがって、一般的にはあなたのメソッド内でautoreleaseを実行する必要があります。ただし、既存のオブジェクトを取り込み、それを何らかの方法で変更するメソッドを記述する場合は、そのオブジェクトを所有しておらず、返されたオブジェクトの自動解放には責任を負いません。 (への自動解放プールは、オブジェクトを排水ます属している場合そうすることで、実際に道路ダウンの問題を引き起こす可能性があります。)

も参照してください(コメント欄にピーターとクインのおかげで!):

+0

技術的には、 "alloc"または "new"で始まるか、 "init"ではなく "copy"を含むメソッドでなければなりません。

+0

を参照してください。コメントでは、リンクの周りに< and >を置くと、URLの最後にエスケープ文字が追加されます。アングルブラケットのない同じURLは次のとおりです。http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html –

+0

'+ stringWithString:'は通常、パラメータがリテラル文字列の場合は小さくなりますが、 '+ stringWithFormat:'では同じことができません - そのメソッドは別個のNSStringインスタンスを返すことが保証されています。 –

関連する問題