2

私はに慣れていないので、ARCなしObjectivce-Cでの正しい方法は何だろうと思っていました。私のライブラリに次を返すメソッドがあるとしましょう:memory managementstatic libraryNSString*

- (NSString *) foo
{
    ...
    NSString *result = [[NSString alloc] initWithString:@"bar"];
    return [result autorelease];
}

私が理解している限りでは、foo割り当てられているので、NSStringそれを解放する(または解放するためにキューに入れる)必要もあります。NSStringは戻り値なので、私にできることはautoreleaseそれだけです。これにより問題が発生します。ライブラリがコマンドラインツールで使用されている場合、開発者は、メイン内でメモリを消費して複数回呼び出す必要があることを知るfoo必要があります。これは、メモリ管理をライブラリからアプリに委任しているように思えますが、これはひどいことのように思えます。これを行うためのより良い方法はありますか?それとも、開発者が必要としていることをどうにかして明らかにすることができますか?@autoreleasepoolfoo@autoreleasepoolfoo@autoreleasepool

4

2 に答える 2

2

自動解放プールは、オブジェクトの割り当てを自動的に解除しません。それらは手動で排出する必要があります。Cocoaアプリケーションでは、これはメインスレッドの実行ループによって実行されるため、通常、ほとんどの開発者はそのために何もする必要がなく、それについても知りません。

mainただし、コマンドラインツールやバックグラウンドスレッドなどの長時間実行される関数では、自動解放プールを定期的に手動で排出するのはプログラマーの責任です。

あなたはグローバルメモリ管理ルールに従っています、そしてそれは正しいことです。何も変更する必要はありません。ARCや静的ライブラリについてではありません。

于 2013-01-09T10:06:08.050 に答える
1

すべてのスレッドにはautoreleasepool*が必要です。コードが呼び出され、プールが配置されていない場合、スレッドは適切に設定されておらず、これはプログラマーエラーです。

スレッド(またはプロセス)を作成しない限り、これはあなたの責任ではなく、あなたに代わって怠惰なメモリ管理とは何の関係もありません。

メソッドが自動解放プールを配置する必要があることを示さない理由は、自動解放プールを常に配置する必要があるためです。

*自動リリースを使用しないObjective-cを作成できます。これについては、内部が変更されたときに自動リリースを使用することはほとんどありません。このようなコードは、Cocoaの小さなサブセットしか使用できず、かなりひどいものになる可能性があります。

于 2013-01-12T09:40:38.607 に答える