/ / iosでの自動リリースプールの使用制限-iphone、ios、nsautoreleasepool

ios、ios、nsautoreleasepoolの自動解放プールの使用制限

アプリケーションで作成できる自動リリースの数はいくつですか?制限はありますか?

グーグルで答えを検索しましたが、有用な情報が得られませんでした。

そして

int main(){

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init];

NSString *str = [NSString alloc]init];

[pool drain];
}

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

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

どちらが正しいか。

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

つまり、このように

int main(){

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

ありがとう Jithen

回答:

回答№1の場合は3

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

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

に通話を追加したとき autorelease 文字列上で、オブジェクトはキューに入れられ、ある時点で自動解放されます。自動解放プールを空にすることで、その解放がトリガーされます。

を使用した最後のコード @autorlease コードの最初のブロックと同じです。あなたは適切に解放しません str 漏れます。しかし、繰り返しますが、これは自動解放プールとは何の関係もありません。

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

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