0

特別なサイズの UIImage を作成する簡単な関数があります:

- (UIImage*)imageWithSize:(CGSize) imSize
{
    UIGraphicsBeginImageContext( imSize );

    float r = 0.5f;
    float g = 0.5f;
    float b = 0.5f;

    CGContextRef cxt = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(cxt, r, g, b, 1.0);
    CGContextSetRGBFillColor(cxt, r,g,b, 1.0);
    CGContextFillRect(cxt, CGRectMake(0.0, 0.0, imSize.width, imSize.height));

    UIImage* retImg = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return retImg;
}

そして、この方法で何度も呼び出します(ARCを使用しています):

for(int i=0;i<3000;i++)
{
    UIImage* im = [self imageWithSize:CGSizeMake(256,192)];
}

メモリの警告を数回受け取り、iPhone4 でクラッシュします;(単純な機能に何か問題がありますか?

4

1 に答える 1

2

これは、ローカルの自動解放プールを持たない大きなループを使用する場合に一般的です。

関数は制御をメイン ループに返さないため、OS に自動解放されたオブジェクトのプールを空にする機会が与えられるため、メモリの占有は無制限に増加し続けます。

これは、ローカルの自動解放プールを使用して、ループ内の各反復で不要なオブジェクトを解放する方法です (ただし、このような「スタディ ケース」ではやり過ぎの可能性があります)。

for(int i=0;i<3000;i++)
{
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
    UIImage* im = [self imageWithSize:CGSizeMake(256,192)];
    [loopPool release];
}

または、新しい構文を使用できます。

    @autoreleasepool {
         ....
    }
于 2013-05-04T09:06:30.333 に答える