

アプリ内でカメラロールから画像を選択して、コレクションビューに表示できるようにしています。

ですが、画像を表示するとメモリを多く消費してしまいます。  
Instrumentsで調べるとimageIO_PNG_Dataが原因だということはわかったのですが、どのように直せばいいのかがわかりません。

[![Instruments\(画像は今回4枚です\)](https://i.stack.imgur.com/TLVvf.png)](https://i.stack.imgur.com/TLVvf.png)

[code]

    //カメラロールを起動
    - (void)showCameraRoll
    {
        UIImagePickerControllerSourceType sourceType
        = UIImagePickerControllerSourceTypePhotoLibrary;
        if ([UIImagePickerController isSourceTypeAvailable:sourceType]) {
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.sourceType = sourceType;
            picker.delegate = self;
            [self presentViewController:picker animated:YES completion:NULL];
        }
    }
    
    
    //カメラロールから画像選択後の処理
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        NSLog(@"画像選択後の処理");
        UIImage *originalImage = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage];
        UIImage *editImage = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage];
    
        UIImage *saveImage;
    
        if (editImage) {
            saveImage = editImage;
        } else {
            saveImage = originalImage;
        }
    
        //カメラで撮った写真のみカメラロールの保存
        UIImageWriteToSavedPhotosAlbum(editImage, nil, nil, nil);
    
        [self addSelectedPicture:self item:saveImage];
        [picker dismissViewControllerAnimated:YES completion:nil];
        [self.collectionView reloadData];
    }
    
    
    //画像保存処理
    + (void)saveLessons:(NSArray *)lessons
    {
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:lessons];  
        NSString *path = [self makeLibraryPath];
        [data writeToFile:path atomically:YES];
    }
    
    + (NSString *)makeLibraryPath
    {
        NSArray *paths =     NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSString *dir = [paths objectAtIndex:0];
        return [dir stringByAppendingPathComponent:@"data.dat"];
    }
    
[/code]

どなたか何か分かる方がいましたら教えてください。  
よろしくお願いします。


CC BY-SA 3.0
2015-11-09T09:23:00.627
18570
2016-06-13T06:07:23.687
8802
question
objective-c iphone
imageIO_PNG_Dataのメモリ使用量が多い


コレクションビューに取得した画像を表示するということは、フルサイズのイメージである必要はなく、サムネイルといわれる、せいぜい100×100ピクセルくらいのイメージであればいいんですよね？だとすれば、フルサイズのイメージを用意すれば、それ相応にメモリを消費するのは道理だと思います。メモリ消費を抑えるには、コレクションビュー用に小さいサイズのイメージを作成するプログラムを書く必要があると思いますが、以下のサンプルコードは、iOS
8より導入された[ **Photos
Framework**](https://developer.apple.com/library/prerelease/ios//documentation/Photos/Reference/Photos_Framework/index.html)を使った、サムネイルイメージを作成して、取得するものです。  
`UIImagePickerController`のDelegateメソッドのみ載せています。Photos Frameworkを使うために、`#import
<Photos/Photos.h>`をインポートしてください。

[code]

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
        // イメージピッカーで選択したイメージのリファレンスURLを取得。
        NSURL *imageURL = (NSURL *)[info objectForKey: UIImagePickerControllerReferenceURL];
        // イメージのアセットassetを取得。
        PHFetchResult *fetchResult = [PHAsset fetchAssetsWithALAssetURLs: [NSArray arrayWithObject: imageURL] options: nil];
        PHAsset *asset = fetchResult.firstObject;
        // 指定したサイズ（仮に72×72）のイメージを生成して返すことを要求。
        [[PHImageManager defaultManager] requestImageForAsset: asset targetSize: CGSizeMake(72.0, 72.0) contentMode: PHImageContentModeAspectFit options: nil
            resultHandler: ^(UIImage *image, NSDictionary *info) {
                // 取得したimageを使用するプログラムを、ここに書きます。
        }];
    
        [self dismissViewControllerAnimated: YES completion: NULL];
    }
    
[/code]


CC BY-SA 3.0
2015-11-10T11:17:32.127
18626
2015-11-10T11:17:32.127
7362
18570
answer