0

ここでは、メモリ管理についての例をいくつか示します。

最初の例では

- (NSString *) fullName {
    NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", self.firstName,       self.lastName] autorelease];
    return string;
}

この例では、上記のメソッドが呼び出される方法です

{
   Person *aPerson = [[Person alloc] init];
   NSString *name = aPerson.fullName;
   [aPerson release];
}

そのため、コード フローが閉じ中かっこに到達した後に *name が自動解放されると想定しています。

本当?

また、一般に、オブジェクトの自動解放は、そのオブジェクトを参照する変数のスコープと有効期間に依存します。

Objective-C プログラムでオブジェクトの自動解放プールを管理する基準はありますか?

ありがとう。

4

1 に答える 1

1

自動解放されたオブジェクトの解放は、オブジェクトがプッシュされた自動解放プールが明示的autoreleaseに解放/排出されたときに行われます。ただし、その時点でのオブジェクトの保持カウントが0+である場合(つまり、自動解放プール以外の誰もがそれを保持している場合)。 )。

オブジェクトがスコープ外になったという理由だけで、オブジェクトが自動解放されません。あなたの例では、中括弧を閉じるにリリースされないことを確認できますが、H2CO3が言ったように、関連するソースコードがないと、実際にいつクリーンアップされるかを予測できません。Cocoa(Touch)アプリでは、runloopsを使用するスレッドには、各runloop反復の終了時に排出されるループレベルの自動解放プールがあります。メソッドがrunloopから呼び出された場合(たとえば、イベントハンドラーコールバックの一部として)、自動解放されたオブジェクトは、ハンドラーコードが返された直後に解放されます。それ以外の場合、そのような保証はありません。

上記は非ARC環境にも当てはまることに注意してください。他の人は、ARCを使用するときにそれがまだ有効かどうかを確認する場合があります。

于 2012-05-06T13:57:39.953 に答える