どちらが正しいですか?この:メモリ管理とperformSelectorInBackground:
NSArray* foo = [[NSArray alloc] initWithObjects:@"a", @"b", nil];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
...
[foo release];
}
または:
NSArray* foo = [[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
...
[pool release];
}
私は最初のものは作品を知っているが、クランはそれについて不平を言うので、使用するより良いパターンがありますかしら。
ああ、それはマニュアルにすぐそこです!愚かな私。 :) – lawrence
私は明確にする必要があります:あなたは何もautoreleaseメソッドがそこに送られることを知らない限り、-baz:の内部に自動解放プールを作成して排水しなければなりません。経験則の最も良い方法は、例2のように自動解放プールを作成して作成することを想定することです。しかし[プール解放]ではなく[プールドレイン]を使用してください。 –
Jim Dovey氏によると、主に主機能と同じように自動解放プールを作成する必要があります(「スレッドプログラミングガイド」を参照)。このプールはfooのautoreleaseとはまったく関係がないことを理解することは重要です。 –