1

私のアプリは、UIImageView内に画像を割り当てて表示します。これは、すべてviewDidLoadにある24個のimageViewで発生します。画像は50枚の画像のリストからランダムに割り当てられます。ビューコントローラは、メイン画面からモーダルにプッシュされます。初回の読み込みには時間がかかります。運が良ければ、ビューが2回目に読み込まれます。3回目は、ほとんどの場合クラッシュします。画像のサイズを約200ピクセルに変更してみました。私は画像を次のように割り当ててみました:

    image1 = [UIImage imageNamed:@"image1.png"];

    [self.imageView setImage: image1];

そしてまた:

    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];

    image1 = [[UIImage alloc] initWithContentsOfFile:imagePath];

この2つ目は、事態を悪化させるだけのようでした。

また、Instrumentsでアプリを実行してみましたが、メモリリークは認識されませんでした。

私は本当に他にどこを向くべきかわかりません。このアプリは膨大な時間の投資を表しており、この問題が解決されることを本当に望んでいます...どうもありがとうございました

4

2 に答える 2

2

小さいバージョンのイメージをディスクからロードする最も効率的な方法は次のとおりimageNamed:ですCGImageSourceCreateThumbnailAtIndex。これが私の本の例です:

NSURL* url =
    [[NSBundle mainBundle] URLForResource:@"colson"
                            withExtension:@"jpg"];
CGImageSourceRef src =
    CGImageSourceCreateWithURL((__bridge CFURLRef)url, nil);
CGFloat scale = [UIScreen mainScreen].scale;
CGFloat w = self.iv.bounds.size.width*scale;
NSDictionary* d =
    @{(id)kCGImageSourceShouldAllowFloat: (id)kCFBooleanTrue,
     (id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue,
     (id)kCGImageSourceCreateThumbnailFromImageAlways: (id)kCFBooleanTrue,
     (id)kCGImageSourceThumbnailMaxPixelSize: @((int)w)};
CGImageRef imref =
    CGImageSourceCreateThumbnailAtIndex(src, 0, (__bridge CFDictionaryRef)d);
UIImage* im =
    [UIImage imageWithCGImage:imref scale:scale
                  orientation:UIImageOrientationUp];
self.iv.image = im;
CFRelease(imref); CFRelease(src);

フルサイズの画像のビットマップをメモリに保持する必要があるため、UIImageView に UIImageView 自体よりも大きな画像を表示するように要求するのは、メモリの膨大な浪費です。イメージ I/O フレームワークは、元のイメージ全体をビットマップとしてメモリにアンパックすることさえせずに、より小さいバージョンを生成します。

于 2013-02-22T03:01:33.803 に答える
1

以前、使用していたビューよりもはるかに大きい通常の Web サイトの画像で、この問題が発生しました。画像は完全な解像度に圧縮解除され、画像ビューに収まります。記憶が正しければ、メモリを占有します。それらを表示する前に、最初に画像ビューのサイズに縮小する必要がありました。CoreGraphics.framework を追加し、このクラスを使用して、画像ビューで使用する画像オブジェクトを作成します。私はそれをオンラインで見つけて、同じ答えを探して少し微調整しましたが、どこにあるか覚えていません。オリジナルを投稿した人に感謝します。

ImageScale.h

#import <Foundation/Foundation.h>

@interface ImageScale : NSObject

+ (UIImage*)imageWithImage:(UIImage*)sourceImage scaledToSize:(CGSize)newSize;

@end

ImageScale.m

#import "ImageScale.h"

@implementation ImageScale

+ (UIImage*)imageWithImage:(UIImage*)sourceImage scaledToSize:(CGSize)newSize
{
    CGFloat targetWidth = newSize.width;
    CGFloat targetHeight = newSize.height;

    CGImageRef imageRef = [sourceImage CGImage];
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
    CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);

    if (bitmapInfo == kCGImageAlphaNone) {
        bitmapInfo = kCGImageAlphaNoneSkipLast;
    }

    CGContextRef bitmap;

    if (sourceImage.imageOrientation == UIImageOrientationUp ||  sourceImage.imageOrientation == UIImageOrientationDown) {
        bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    } else {
        bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    }

    if (sourceImage.imageOrientation == UIImageOrientationLeft) {
        CGContextRotateCTM (bitmap, M_PI_2); // + 90 degrees
        CGContextTranslateCTM (bitmap, 0, -targetHeight);

    } else if (sourceImage.imageOrientation == UIImageOrientationRight) {
        CGContextRotateCTM (bitmap, -M_PI_2); // - 90 degrees
        CGContextTranslateCTM (bitmap, -targetWidth, 0);

    } else if (sourceImage.imageOrientation == UIImageOrientationUp) {
        // NOTHING
    } else if (sourceImage.imageOrientation == UIImageOrientationDown) {
        CGContextTranslateCTM (bitmap, targetWidth, targetHeight);
        CGContextRotateCTM (bitmap, -M_PI); // - 180 degrees
    }

    CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage* newImage = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);
    CGImageRelease(ref);

    return newImage; 
}

@end
于 2013-02-22T02:42:32.587 に答える