1

私は Obj-C にかなり慣れていないので、知識を深めるために役に立たないプログラムを作成し始めたばかりです。メモリリークが発生していないことを確認したかったのです。「@autoreleasepool」内の何かは、プログラムの終了時にメモリを自動的に解放しますか?

また、悪い癖があれば教えてください!

int main(int argc, const char * argv[])
{
    @autoreleasepool {

        Fraction* fractionOne = [[Fraction alloc]init];
        Fraction* fractionTwo = [[Fraction alloc]init];
        Fraction* fractionThree = [[Fraction alloc]init];

        [fractionOne setTo:1 over:2];
        [fractionTwo setTo:1 over:4];
        [fractionThree setTo:1  over:8];

        [Fraction numberOfFractions];

        return 0;
    }
}
4

4 に答える 4

4

高度なメモリ管理プログラミング ガイド自動解放プール ブロックの使用に関する Apple の説明を参照してください。

要するに、いいえ、「@autoreleasepoolプログラムの終了時にメモリを自動的に解放する」(または少なくとも関数としてではなく@autoreleasepool)というわけではありません。自動解放プールを持つ目的は、メモリーが自動解放項目からいつ回収されるか、つまりいつプールが空になるかを制御することです。ただし、コードサンプルは自動解放されたアイテムを使用していないように見えるため、ここでは実際には適用できません (メソッドが内部で自動解放オブジェクトを使用しない限り)。

自動解放プールの最も一般的な使用法は、アプリのメモリの最高水準点を下げることです。ローカル自動解放プール ブロックを使用してピーク メモリ フットプリントを削減する を参照してください。以前はスレッド プログラミングに使用されていましたが、操作ブロックとディスパッチ ブロックができたので、従来のスレッド コードを記述する必要がなくなりました。そのため、マルチスレッド コードで個別の自動解放プールが必要になる機会はそれほど多くありません。

于 2013-07-21T21:47:09.170 に答える
0

それは多かれ少なかれそれがすることです。でも心配はいりません。ARC に頼ってください。それはあなたのためにあなたの記憶を管理します!

ARC を使用すると、実際に表示される唯一の場所@autoreleasepoolは main 関数です。アプリの作成を開始すると、別の場所にコードを記述し、「デフォルト」のメイン関数 (Xcode テンプレートによって提供される) を編集することはほとんどありません。

だから心配しないでください!あなたのコードは大丈夫です:)

于 2013-07-21T21:33:26.410 に答える
0

ARC を有効にすると、コンパイル時にコードが追加され、fractionOne、Two、および Three が明示的に解放されるため、ARC で解放されます。ARC を使用しないと、alloc によって Fraction の保持されたインスタンスが作成され、コードが明示的に解放されていない (ほとんどの場合は改善) か、これらを自動解放として設定していない (ほとんどの場合は悪化)。

したがって、arc がないと、このプログラムが実行されている数ミリ秒の間にリークが発生します。

于 2013-07-21T21:34:47.167 に答える