-2

重複の可能性:
リリースと自動リリースの違いは何ですか?

こんにちは、リリースと自動リリースの違いを詳しく教えてください。また、ユーザー定義の自動リリース プールを作成する方法はありますか?また、自動リリース プールの実際の使用法について教えてください。

4

2 に答える 2

4

Release は、オブジェクトの参照カウントをすぐに減らします。つまり、保持カウントがゼロになると、すぐに割り当てが解除されます。Autorelease は遅延リリースです。所有権の引き継ぎに役立ちます。

のような方法を考えてみましょう+[NSString stringWithFormat:]。新しいNSStringインスタンスを ( alloc& の何らかの形式でinit) 作成し、それを呼び出し元に渡します。そのクラス メソッドは、その後も作成された文字列を「所有」したくありませんが、新しい文字列を返す前に解放すると、呼び出し元が取得する前に新しい文字列の割り当てが解除されます。代わりに、新しい文字列を自動解放します。つまり、呼び出し元が必要に応じて取得して保持するのに十分な時間、文字列が残ります。

発信者がそれを保持しない場合はどうなりますか? そこで、自動解放プールの出番です。はすべてのNSAutoreleasPoolを追跡し、autoreleaseドレインするように指示されると、プール内のすべてのオブジェクトを解放します (参照カウントがゼロになると、オブジェクトの割り当てが解除されます)。Mac または iOS アプリのデフォルトでは、メイン イベント ループに自動解放プールがあります。そのため、呼び出しstringWithFormat:て結果を保持しないと、次のパスで消えてしまいます。

で独自の自動解放プールを作成しNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]、 で排出できます[pool drain]。これは、大量の一時オブジェクトを作成するコード セクションがある場合に役立ちます。

于 2012-04-21T06:18:34.810 に答える
0

releaseオブジェクトをすぐに解放しますautoreleaseが、将来のある時点で解放します。

例:autoreleaseここで d オブジェクトを返すreleaseと、このメソッドを呼び出すコードが返されたオブジェクトを使用できるようになる前に、dealloc が取得されるためです。

- (NSObject *)someMethod
{
    return [[[NSObject alloc] init] autorelease];
}
于 2012-04-21T06:03:00.423 に答える