3

NSArrayの自動解放されたインスタンスが、返されるメソッドで使用される前に解放されるのを妨げているのは何ですか?

- (NSArray *) f {
    return [NSArray array];
}

- (void) g {
    NSArray *a = [self f];
    // do something with a
}
4

3 に答える 3

5

自動解放された NSArray のインスタンスが、返されたメソッドで使用される前に解放されるのを妨げているのは何ですか?

自動解放プールはスレッドごとです。つまり、自動解放されたオブジェクトは、事実上、releaseスレッドごとに発生する遅延呼び出しです。

したがって、drain呼び出し元と呼び出し先の間に への呼び出しがない場合、自動解放されたオブジェクトがプールのドレインのために解放されることはありません (深刻なスレッド化の愚かさを除けば)。

一般に、ケビンが言ったように、プールは非常に適切に指定された時間に排出されます。

•実行ループは、ループを通過する各パスの下部でプールを排出します

• GCD 経由でディスパッチされたブロックは、「時々」排出されるプール コンテキスト内で実行されます (実装の詳細)。NSOperationQueue も同様に動作します

• 他のスレッドはそれを自分で行う責任があります

したがって、あなたの単純な例では、コードの実行は非常に線形であり、検査によると、呼び出し元での戻りと使用の間の実行スレッドにドレインはありません。

retainCount(これは、が役に立たない理由の 1 つでもあることに注意してください。原因による「遅延リリース」呼び出しは考慮されてautoreleaseおらず、スレッドごとの保持を定量化することもありません。実際には、保持/解放は完全に-thread;あるスレッドから別のスレッドに明示的に所有権を譲渡しない限り、オブジェクトをスレッドに保持する場合は、同じスレッドで解放する必要があります。)

于 2012-05-08T23:01:34.217 に答える
4

自動解放されたオブジェクトは、周囲のプールが空になったときにのみ解放されます。これは、舞台裏で行われる魔法のプロセスではありません。これは、明確に定義された時間に発生する決定論的なイベントです。一般に、制御が実行ループに戻ると、プールは空になります。独自のネストされたプールを確立する場合は、それがいつ排出されるかを制御します。

于 2012-05-08T22:55:59.170 に答える
2

自動解放プールは、イベントループの反復中に排出されます。自動解放されたオブジェクトに解放メッセージが送信されるのはそのドレインであるため、それらは呼び出し元のメソッドで引き続き有効です。

于 2012-05-08T22:55:38.577 に答える