2

画像を縮小するには、次の方法があります。しかし、ipad 2 を使用して画像をクリックし、このメソッドを呼び出すたびに、計測器のアプリケーションの実際のメモリ サイズが 20 MB 増加します。最終的にアプリケーションをクラッシュさせます。このメソッドは常にメイン スレッドで実行されます。このようにメモリが大幅に増加する理由として考えられるのは何ですか? . ARCを使用しています。

+ (UIImage*)imageWithImage:(UIImage*)image
                  scaledToSize:(CGSize)newSize
    {
        CGFloat ratioForCompressionAspect = 1.0;
        if ( image.size.width/newSize.width > image.size.height/newSize.height){
            ratioForCompressionAspect = image.size.width/newSize.width;
        }
        else{
            ratioForCompressionAspect = image.size.height/newSize.height;
        }

        newSize = CGSizeMake(image.size.width/ratioForCompressionAspect, image.size.height/ratioForCompressionAspect);

        UIGraphicsBeginImageContext(newSize);
        [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
        image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }

EDIT:いくつかの詳細情報:この行にある場合

 [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];

私がやります

[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];

画像は拡大縮小されませんが、サイズ 20 MB はなくなります。

4

1 に答える 1

0

ここで推測を危険にさらしますが、スケール関数に渡す画像への参照があるという理論があります。次に、スケーリングされた画像で画像をオーバーライドしています

    image = UIGraphicsGetImageFromCurrentImageContext();

そして、あなたはそれを返します。元の画像へのすべての参照を破棄してよろしいですか? そうしないと、メモリ内に留まり、使用されるのを待ちます。

次に、元の画像を取得するために imageNamed または imageWithData または imageWithContentsOfFile を使用していますか? imageNamed と imageWithData の両方 (データの取得方法によって異なります) を使用すると、アプリはファイルをキャッシュして、後で読み取り速度を速くすることができます。

長く困難な旅の後に、IOS プログラミングの賢明な賢者から学んだたとえ話を共有します。アプリを終了させて​​、狂ったように笑っている可能性も同じです。ユーザーが何度もアクセスし続けるのでない限り、データをキャッシュするメソッドは避けた方がはるかに良いでしょう。」

于 2013-08-08T00:51:20.833 に答える