[objectInstance autorelease]
を呼び出すと、現在のNSAutoreleasePool
にオブジェクトが追加されます(独自の実装を提供する場合は、それも可能です)。そのプールはdrain
メッセージを受信すると、プール内のすべてのオブジェクトにrelease
を送信します。これらのオブジェクトのいずれかがretainCountが0になると、それらのオブジェクトはその時点で割り当てが解除されます。オートリリースの目的は、「将来のある時」にリリースされるオブジェクトをマークすることです。これは、新しく割り当てられたオブジェクトを返すメソッドのようなもので、呼び出し元が返されたオブジェクトの所有権を取る必要がないように解放したい場合に特に便利です。この方法は、次のようになります。
- (id)myMethod {
id myObj = [[SomeClass alloc] init];
...
return [myObj autorelease];
}
彼らは、戻り値の所有権を取るかどうそれを無視したい場合myMethod
だろう、その後retain
戻り値の呼び出し元。現在のNSAutoreleasePool
が流出すると、myObj
はリリースメッセージを受け取ります。他のオブジェクトがそれを所有していない(すなわち、retain
メッセージを送信した)場合、そのオブジェクトは割り当て解除されます。
このすべては、ココアMemory Management Programming Guideで説明されています。あなたがすでにそれを読んだとしても、それはいつも他の読書の価値があります。
だから、あなたの質問に答えるために:
まず、あなたはtheBackendResponse
を解放する必要があります。あなたがしない場合は、メモリがリークされます。 accountDictionary
が文字列で何をするのかを知る必要はありません。参照を保持する必要がある場合は、theBackendResponse
を保持します。あなたはalloc
なので、theBackendResponse
の所有権を持っていますので、その所有権を譲渡する必要があります(release
または間接的にautorelease
経由)。
第2に、そのオブジェクトまたは値への参照をそれぞれ保持したい場合は、引数をsetAccountDictionary:
に保持またはコピーする必要があります。標準のセッターメソッドは次のようになります(あなたがアトミックセマンティクスを必要としないと仮定):あなたが使用しているように見えるので
- (void)dealloc {
[accountDictionary release];
[super dealloc];
}
:
-(void)setAccountDictionary:(NSDictionary*)newDict {
if(newDict != accountDictionary) {
id tmp = accountDictionary;
accountDictionary = [newDict copy]; //Since newDict may be mutable, we make a copy so that accountDictionary isn't mutated behind our back.
[tmp release];
}
}
あなたはまた、deallocメソッドでrelease
accountDictionaryに覚えておく必要がありますNSViewController
、あなたはLeopard(OS X 10.5)を使用していると仮定します。可能であれば、@property
と@synthesize
dゲッター/セッターを使用しているはずです。これを行うには、
@property (copy,readwrite) NSDictionary * accountDictionary;
をクラス@interface
に追加します。コントローラクラスの@implementation
ブロックに@synthesize accountDictionary;
ディレクティブを追加します。
印象的な答え。 –
素晴らしいです、ありがとうございます。今分かります。私はUIViewControllerを使ってiPhone上に実際にいますが、明らかにObjective-C 2.0がまだ適用されています。私はこのために合成されたgetter/setterを使用するつもりはありませんが、将来私はそれを行います。再度、感謝します! – AriX
これはやや間違っています。新しいオブジェクトを保持/コピーする前に古いオブジェクトを解放してはいけません。 'accountDictionary'が' newDict'を参照している場合は、まず 'release'を呼び出すと、早くリリースされます。私は複数のコードを追加することはできませんが、回答として代替ソリューションを追加します –