4

次のような写真ライブラリから複数の画像をインポートするために、 ChuteSDKを使用しています。

-(void)doneSelected{
NSMutableArray *returnArray = [NSMutableArray array];
[self showHUD];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
    for(id object in [self selectedAssets]){
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        if([object isKindOfClass:[GCAsset class]]){
            ALAsset *asset = [object alAsset];
            NSMutableDictionary* temp = [NSMutableDictionary dictionary];
            [temp setObject:[[asset defaultRepresentation] UTI] forKey:UIImagePickerControllerMediaType];

            [temp setObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:1 orientation:(UIImageOrientation)[[asset defaultRepresentation] orientation]] forKey:UIImagePickerControllerOriginalImage];

            [temp setObject:[[asset defaultRepresentation] url] forKey:UIImagePickerControllerReferenceURL];
            [returnArray addObject:temp];
        }
        [pool release];
    }
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        if(delegate && [delegate respondsToSelector:@selector(PhotoPickerPlusController:didFinishPickingArrayOfMediaWithInfo:)])
            [delegate PhotoPickerPlusController:[self P3] didFinishPickingArrayOfMediaWithInfo:returnArray];
        [self hideHUD];
    });
});
}

しかしfullScreenImage、元の画像の縮小版を提供しています。それを使用すると、アプリがクラッシュするという問題fullResolutionImageが発生します。low memory warning

メモリの問題を引き起こさずに元の解像度で画像を取得するにはどうすればよいですか。

PS:ARC私のプロジェクトでは使用していません。

4

2 に答える 2

2

宣言した 'returnArray' 変数は、自動解放プール ブロックの外にあります。現在、自動解放プール内にあるディクショナリ「temp」に画像を追加していますが、最終的にはこの「temp」を「returnArray」に追加しているため、保持カウントが増加し、実際にリークが発生しています。

画像を操作するときは、もう 1 つ注意してください。画像を使用している場合、多くの人が期待するファイルサイズとして表示されるメモリを使用しません (つまり、2048 x 1536 の場合は 3MB 未満のもの)。代わりに、実際には、次の計算に基づいてメモリを使用する raw 形式でロードされます。

幅 x 高さ xn バイト n は、ピクセルあたりの色を表すために使用されるビット数です。ほとんどの場合、4 です。

同じ 2048 x 1536 の画像の場合、12MB かかります。

それでは、話している画像の元の解像度を確認し、どれだけのMBがかかるかを計算し、それに応じてコードを変更してください。

于 2013-08-08T15:01:10.973 に答える