1

ARC を使用して iOS 5 用のアプリを作成していますが、メモリに問題があるようです。基本的には、ディスプレイの一部のスクリーンショットを撮り、UIImage を MSMutableArray に配置してから、スクリーンショットをつなぎ合わせて 1 つの大きな画像を作成します。問題は、これを数回実行した後、メモリ使用量が多いために OS がアプリケーションを閉じることです。

UIImage をまとめたスニペットを次に示します。

UIImage* finalImage = nil;
//join the screenshot images together
UIGraphicsBeginImageContext(CGSizeMake(collage.width, collage.height));
{
    int hc = 0;
    for(UIImage *img in imageArr)
    {
        NSLog(@"drawing image at:: %i", hc);
        [img drawAtPoint:CGPointMake(0, hc)];
        hc+=img.size.height;
        img = nil;
    }

    //NSLog(@"creating finalImage");
    finalImage = UIGraphicsGetImageFromCurrentImageContext();
}
UIGraphicsEndImageContext();
//do something with the combined image
//remove all the objects
[imageArr removeAllObjects];
//reset class instance
[self setImageArr: [[NSMutableArray alloc] init]];

あまり多くのメモリが使用されないように、私が使用できる他の代替手段はありますか? 配列に CGImageRef を保存することはありますか? 上記のコードでメモリリークの可能性はありますか?

ヒント、指針をいただければ幸いです。

ありがとう。

4

4 に答える 4

1

[imageArr removeAllObjects];オブジェクトを配列から削除します。でアレイを再度リセットする必要はありません

 [self setImageArr: [[NSMutableArray alloc] init]];

これを行うことで、NSMutableArray オブジェクトを割り当て、解放しません。

行を削除してみてください[self setImageArr: [[NSMutableArray alloc] init]];

于 2012-04-06T18:55:16.010 に答える
0

の後にメモリの問題が発生するとおっしゃっているからですdoing this a couple of timesNSAutoreleasePool次に、以下の例のように、メソッドの後にシステム リリース オブジェクトを強制的に使用するのはどうでしょうか。

@autoreleasepool {
    UIImage* finalImage = nil;
    //join the screenshot images together
    UIGraphicsBeginImageContext(CGSizeMake(collage.width, collage.height));
    {
        int hc = 0;
        for(UIImage *img in imageArr)
        {
            NSLog(@"drawing image at:: %i", hc);
            [img drawAtPoint:CGPointMake(0, hc)];
            hc+=img.size.height;
            img = nil;
        }
        finalImage = UIGraphicsGetImageFromCurrentImageContext();
    }
    UIGraphicsEndImageContext();
    //do something with the combined image
    //remove all the objects
    [imageArr removeAllObjects];
    //reset class instance
    [self setImageArr: [[NSMutableArray alloc] init]];
}

また、他のコードにメモリリークの問題があるとは思えません。ARCを使用してもメモリリークの問題がなければ意味がありません.グローバル変数などに多くの役に立たないオブジェクトを格納している可能性があります.

おそらく、Instruments を使用してメモリを監視し、メモリがどこにあるかを把握する必要があります。

于 2012-04-07T04:40:19.340 に答える
0

必ずsetImageArrを割り当てて初期化してください

if (setImageArr == nil){
setImageArr = [[NSMutableArray alloc]init];
}
else
{
[setImageArr removeAllObjects];
}

または使用します(既存の配列から初期化したい場合):

NSMutableArray *setImageArr = [[NSMtableArray]initWithArray:arrayOfImages];
于 2012-04-06T18:40:05.593 に答える
0

imageArr が適切にクリアされていることがわかりました。プログラムのどこかにメモリの問題があるようです。

于 2012-04-09T13:24:17.050 に答える