0

アプリケーションでいくつのオートリリースを作成できますか? 制限はありますか?

Google で回答を検索しましたが、有用な情報は得られませんでした。

int main(){

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init];

NSString *str = [NSString alloc]init];

[pool drain];
}

Google では、ほぼすべての記事でこのサンプルを見つけました。上記のコードを Xcode で解析すると、メモリ リークが発生します。代わりに、この方法で str を割り当てると、 NSString *str = [NSString alloc]init]autorelease;

その後、メモリリークは発生しません。

どの方法が正しいです。

また、上記のコードでは、[プールドレイン] ステートメントが実行されると、変数 str が解放されることがわかりました。NSAutoreleasePool の代わりに「@autorelease」キーワードを使用して同じコードを記述すると、どうなりますか。@autorelease を使用すると、[プールのドレイン] のようなステートメントはありません。

私はこのように意味します

int main(){

@autorelease{
NSString *str = [NSString alloc]init];
}
}

ありがとうジテン

4

1 に答える 1

3

NSAutoreleasePoolorの使用は、@autoreleaseメモリ リークを修正するためのものではありません。それらの使用は、自動解放されたオブジェクトが解放されるときの範囲を制御するのに役立ちます。自動解放プールを使用するかどうかに関係なく、適切なメモリ管理を行う必要があります。

投稿したコードの最初のブロックでは、文字列を割り当ててもオブジェクトを呼び出さないため、メモリ リークが発生releaseします。この場合、strは自動解放されたオブジェクトではありません。自動解放プールは、このオブジェクトには影響しません。

文字列に呼び出しを追加するとautorelease、オブジェクトはキューに入れられ、ある時点で自動解放されます。自動解放プールをドレインすると、その解放がトリガーされます。

最後に使用したコード@autorleaseは、最初のコード ブロックと同じです。きちんとリリースしないstrと漏れます。ただし、これは自動解放プールとは関係ありません。

ARC を有効にすると、投稿したコードの最初と最後のブロックの問題が修正されます。ARC がリリースstrを担当します。

編集: 上記のコメントで述べたように、自動解放されたオブジェクトが実際にいつ解放されるかを制御するために必要な数の自動解放プールを持つことができます。

于 2012-10-30T05:49:10.130 に答える