質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

ios モジュールで落ちる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,644

score 36

xcode 6.2
iOS 8.1
MAC OS 10.10.2

ELCImagePickerにて上記環境で実機転送した際、写真を150枚くらい選択すると落ちます。エミュでは落ちません。
メモリー関連だとは思うのですが、対策をご教授お願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

メモリ不足で落ちているときは直前のログにReceived memory warningと出るのでまずそれを確認してください。
メモリ不足だとすれば、同じ症状がGitHubのissueに上がっており、解決法も提示されているので、まずはそれらを試してみてはいかがでしょうか。

Crash when you select 30 images · Issue #36 · B-Sides/ELCImagePickerController

Crashed when selecting more than 100 images from photo library · Issue #50 · B-Sides/ELCImagePickerController

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/21 16:02

    Mitsuyoshi 様

    ご回答ありがとうございます。
    ご指摘のように「Received memory warning」が出るときもあれば
    Xcodeでメモリー足りないよ的なアラートポップアップされる場合もあったりです。

    ご提示頂きましたのは目を通しておりましたがソースコードがELCimagePickerでもバージョンが違うのか
    修正箇所の該当コードが見当たらずでまた、英語読解力に乏しくスルーしておりました。
    今回のMitsuyoshi 様のご回答を元に再度挑戦しました。
    同じように悩まれる方がいらっしゃれば参考になると思いますので、その内容を記しておきます。

    GitHubにある情報---------------以下
    1.Comment out the following line in ELCImagePickerController.m
    // Do not hold images in the array - crashes when several large images are selected
    // [workingDictionary setObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]] forKey:@"UIImagePickerControllerOriginalImage"];

    2.In your implementation of - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info, do the following:
    ---------------------------ここまで

    当方の環境で上記1のコードがありませんでした。(バージョンによるものかも?)
    原因はNSMutableArrayへUIImageの画像データそのものをpushしており、大量の画像選択または
    複数大量選択にてオーバーフローしていると思われる。

    対策として選択したものをBLOBのように扱わずasset URLだけ返すようにして、実装側の方で上記2にある
    メソッド内で取得したasset URLに対して保存とか、表示などの処理を行うようにします。


    一応、私の環境でELCImagePickerController.mの該当部分のメソッッドを掲載しておきます。

    - (void)selectedAssets:(NSArray *)assets
    {
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];

    for(ELCAsset *elcasset in assets) {
    ALAsset *asset = elcasset.asset;
    id obj = [asset valueForProperty:ALAssetPropertyType];
    if (!obj) {
    continue;
    }
    NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init];

    CLLocation* wgs84Location = [asset valueForProperty:ALAssetPropertyLocation];
    if (wgs84Location) {
    [workingDictionary setObject:wgs84Location forKey:ALAssetPropertyLocation];
    }

    [workingDictionary setObject:obj forKey:UIImagePickerControllerMediaType];

    //This method returns nil for assets from a shared photo stream that are not yet available locally. If the asset becomes available in the future, an ALAssetsLibraryChangedNotification notification is posted.
    ALAssetRepresentation *assetRep = [asset defaultRepresentation];

    if(assetRep != nil) {


    /*ここから
    if (_returnsImage) {
    CGImageRef imgRef = nil;
    //defaultRepresentation returns image as it appears in photo picker, rotated and sized,
    //so use UIImageOrientationUp when creating our image below.
    UIImageOrientation orientation = UIImageOrientationUp;

    if (_returnsOriginalImage) {
    imgRef = [assetRep fullResolutionImage];
    orientation = [assetRep orientation];
    } else {
    imgRef = [assetRep fullScreenImage];
    }
    UIImage *img = [UIImage imageWithCGImage:imgRef
    scale:1.0f
    orientation:orientation];
    //[workingDictionary setObject:img forKey:UIImagePickerControllerOriginalImage];
    }
    ここまでコメントアウト */

    [workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:UIImagePickerControllerReferenceURL];

    [returnArray addObject:workingDictionary];
    }

    }
    if (_imagePickerDelegate != nil && [_imagePickerDelegate respondsToSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:)]) {
    [_imagePickerDelegate performSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:) withObject:self withObject:returnArray];
    } else {
    [self popToRootViewControllerAnimated:NO];
    }
    }

    最後にMitsuyoshi 様、本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る