質問

私はautoreleasepoolについて読んでてきたが、私には少し不明確である点があります。私はautoreleasepoolを使用して別々のメモリ管理を必要なスレッドを使用していくつかの機能を持っています。

次の例で正しい

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

これは正しいですか?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

あるいは、この?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

私の質問は、具体的relasedするために自動解放プールの必要性の範囲で作成されたオブジェクトを所有またはautorelasepoolがリリースされているときの世話しているのですか?

テオ

役に立ちましたか?

解決

自動解放プールハンドル自動解放オブジェクト。あなたは(アロケーションを介して、またはコピーまたは保持)オブジェクトを所有している場合、あなたはそれを解放する必要があります。だからあなたの第二の例が正しくありません。あなたは、文字列が割り当てられているとして、あなたはそれを所有し、あなたはそれを解放する必要があります。

自動解放プールはメインスレッド用に作成されます。 (あなたがしたい場合は、main関数の中に見ることができます)。すべてのスレッドは、自動解放オブジェクトを管理するために、独自の自動解放プールを必要としています。あなたが別のスレッドを作成した場合、あなたはそのスレッドの自動解放プールを作成しなければならない理由です。あなたがスレッドで自動解放オブジェクトを作成しない場合でも、自動解放オブジェクトを作成することがあり、そのスレッド内のライブラリの呼び出しとしてこれを作成する必要があります。あなたは何のライブラリ呼び出しが自動解放オブジェクトを作成されていないことを確認している場合でも、それがベストプラクティスであるとして、あなたはまた、あなたが開発し、複数の人によって維持されている大きなプロジェクトに取り組んでいる特別な場合には、それらを作成する必要があります。

他のヒント

あなただけがの束を作成している独自の自動解放プールを作成する必要があります あなたが収集すぐにごみにしたいオブジェクトを自動解放。あなたが任意の「自動解放」あなたがプールを解放した後、作成したオブジェクトを参照するようにしたくないという点で、しかし、あなたは正しいです。プールが排出されたとき(あなたが保持していない)自動解放オブジェクトが破棄されます。

あなたの例では、オブジェクトのどれもあるので、独自の自動解放プールは、本質的に何もしません作成し、自動解放されます。

どちらも、あなたの例の自動解放プールを必要とします。自動解放プールのみ自動解放オブジェクトの世話をします:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

あなたの最初の文字列は、(多分他の誰かがもっと知っている)は、文字列リテラルを使用して初期化し、したがって、おそらくメモリ管理に関して特別です。あなたの2番目の文字列リークは、プールは違いはありません。あなたの3番目の文字列が正しく解放され、再びプールには違いはありません。

あなたがプールを必要とする場所です。

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}
プールがなかった場合は、

ここでfoo文字列が漏れてしまいます。 iOSの上の違いはありませんが、それは正しいものを呼び出すのが習慣に取得した方が良いでしょうですので、ガベージコレクト環境で2は、異なる

- 。私はプールに代わりdrainreleaseを呼んでいることに注意してください

また、あなたはどんな自身をオブジェクト自動解放していないにもかかわらず、あなたがあなたの方法で呼び出しているコードのどこかに行って、多くのメモリ操作があるかもしれません、プールを必要とするかもしれないことに注意ます。

これは、このようなものであるべきだと思います:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

あなたは、自動解放プール内のオブジェクトに、自動解放メッセージを送信する必要があります。解放メッセージがプールに送信されたときに彼らがリリースされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top