7

私は目的の c を初めて使用し、autorelease がいつどのように呼び出されるかを理解しようとしています。次の単純な使用例を理解しています。

- (void) foo {
    Bar *b = [[[Bar alloc] init] autorelease];
    [self doSomething:b];
  }

この次のケースはどうですか? オブジェクトは makeBar のスコープを離れるとすぐに解放されるため、これはバグですか?

-(Bar*) makeBar
{
    return [[[Bar alloc] init] autorelease];
}

発信者が保持を行う場合はどうなりますか?

Bar *b = [[self makeBar] retain];

ありがとう、-エリック

4

2 に答える 2

6
-(Bar*) makeBar
{
    return [[[Bar alloc] init] autorelease];
}

2 番目のケースは、Objective-C オブジェクトを返すための推奨される方法です。+alloc-copy...およびを除いて-create...、メソッドは返されるオブジェクトの所有権を保持してはなりません。つまり、保持カウント (の変更) は 0 でなければなりません。

ただし、[[Bar alloc] init]オブジェクトのretainCountが+1になるようにするため、戻る前にオブジェクトを解放する必要があります。ただし-release、オブジェクトの割り当てがすぐに解除され、メソッドが役に立たなくなります。-autoreleaseが使用されるのはそのためです。つまり -release、オブジェクトは最終的に解放されますが、今は解放されないため、コードの他の部分は引き続きオブジェクトと対話できますが、保持カウントは 0 に調整できます。


Bar *b = [[self makeBar] retain];

オブジェクトの長期所有者になる場合を除き、保持しないでください。b

于 2010-02-17T16:16:24.183 に答える