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

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

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1256閲覧

【swift】UIImageをcropした際に起こるエラー

chestnutforest

総合スコア9

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/16 04:42

編集2020/04/16 05:42

###質問
UIImageをcropしたところ以下のようなエラーが発生します。

swift

1-[UIImage release]: message sent to deallocated instance 0x288ca6250

このエラーを追跡してみると以下のコードでエラ-が起きていることが判明しました。

swift

1extension UIImage { 2 func crop(rect to: CGRect) -> UIImage? { 3 var opaque = false 4 if let cgImage = cgImage { 5 switch cgImage.alphaInfo { 6 case .noneSkipLast, .noneSkipFirst: 7 opaque = true 8 default: 9 break 10 } 11 } 12 13 UIGraphicsBeginImageContextWithOptions(to.size, opaque, scale) 14 draw(at: CGPoint(x: -to.origin.x, y: -to.origin.y)) //ここで発生 15 let result = UIGraphicsGetImageFromCurrentImageContext() 16 UIGraphicsEndImageContext() 17 return result 18 } 19}

具体的には上のコードのこの部分です。

swift

1draw(at: CGPoint(x: -to.origin.x, y: -to.origin.y))

開発環境は
xcode 11.4です。
もし解決策をご教授いただけるのであれば大変助かります。
よろしくお願いいたします。

###追加情報
この関数を毎フレームに対して動かしていて、基本的に問題ないのですが、極たまに上記のエラーが急に発生します。
アプリを立ち上げた瞬間に起こることもあれば、長く動かした後に起こることもあります。
質問を投稿した後に判明しましたが、厳密にいうとdrawがエラーを起こしているわけではなくて、エラーが発生して、breakするタイミングが必ずdrawのタイミングになります。

この質問では私が投稿した前の質問にリンクしています。
https://teratail.com/questions/251948

私が取り組んでいるプロジェクトではベストアンサーのものを採用しました。理由は単純に今のアプリとのcompatibilityが高かったからです。他の方々の提示してくれた方法もcropできますが、アプリと最もよくマッチしたのはこちらのコードでしたので、このような形となっております。
前問に協力していただいた皆様には深く感謝を申し上げます。

後から追加ばかりですみません。
元々はEXE_BAD_ACCESSというiOSでは有名はエラーにぶち当たってしまったのが発端です。これに遭遇した人はわかると思うのですが、このエラーが発生すると、コードのどの部分がいけないのかを教えてくれません。そこでZombieを追跡することにしました。すると、まず最初に上記のエラー文がターミナル上に表示され、何回も実行してよくよく探してみるとどの実行時のエラーでも同じdrawで止まっている、という共通点を発見した次第です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakiHori

2020/04/16 06:21

このエラーは止まった(crashした)ところが問題であることは決してありません。 この問題はオーナーシップの設定ミスで本来保持(強参照)しなければならないオブジェクトを保持しなかった(弱参照)ために実際に利用しようとした時にオブジェクトが破棄されているため起こります。 ですので止まったところのソースコードだけでは問題は見つけることはできません。 オーナーシップを見直してください。 問題が起こっているオブジェクトはUIImageのインスタンスですのでそこをヒントにひたすら探すしかありません。 ローカス変数として保持したものを非同期な別スレッドに弱参照で渡したなどもありえますのでとにかくオーナーシップをすべて見直してください。
chestnutforest

2020/04/16 06:55 編集

ありがとうございます。おそらく私の問題は以下のリンクと同じ問題ですよね。10年前ですが。 http://shitappaprogramer.seesaa.net/article/151284495.html 「ローカス変数として保持したものを非同期な別スレッドに弱参照で渡したなどもありえますのでとにかくオーナーシップをすべて見直してください。」 自分でも身に覚えがあります。「弱参照」についてご教授いただけますか。 やむなくグローバル変数で関数間の画像の受け渡しを行ってしまっているのですが.....
hoshi-takanori

2020/04/16 11:21

カメラの画像を毎フレーム UIImage にして、最終的にどうしたいのか (そもそも何をするアプリなのか) まで書いた方が適切なアドバイスが得られると思います。
guest

回答1

0

ベストアンサー

質問に書かれたcrop処理は切り取った画像の再描画処理が行われるため、かなり負荷がかかります。画像のサイズにもよりますが、これを毎フレーム毎に動かしていたのでは、処理が追いつかなくなったり、メモリ不足が発生したりしそうな気がします。基本的に問題ないのに、極たまにエラーが発生するということは、そういうシステム性能の問題が
起きているような気がします(単なる勘ですが)。

改善する保証はありませんが、
https://qiita.com/YutoMizutani/items/bca10568a875ed5ac3d3
で説明されている

swift

1extension UIImage { 2 func cropping(to rect: CGRect) -> UIImage? { 3 let croppingRect: CGRect = imageOrientation.isLandscape ? rect.switched : rect 4 guard let cgImage: CGImage = self.cgImage?.cropping(to: croppingRect) else { return nil } 5 let cropped: UIImage = UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation) 6 return cropped 7 } 8}

のようにCGImageのcroppingメソッドを使った方法に変更してみることをお勧めします。
この方法は、画像の再描画を行わないため、質問に書かれた方法と比べて処理速度が段違いのはずです。

投稿2020/04/16 15:20

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chestnutforest

2020/04/18 12:45

非常に助かります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問