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

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

新規登録して質問してみよう
ただいま回答率
85.35%
メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Xcode

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

Swift

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

Q&A

解決済

1回答

1760閲覧

【Swift】Terminated due to memory issue, メモリリークを起こしている?

kazuhiro_ikeda

総合スコア5

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/04/18 01:06

編集2021/04/18 01:09

#解決したいこと
以下事象のようなエラー事象が発生する「原因特定」、「解決方法の理解」

#エラー事象
The app “testCoreML” on "実機端末名称" quit unexpectedly.
Domain: IDEDebugSessionErrorDomain
Code: 4
Failure Reason: Message from debugger: Terminated due to memory issue

System Information

macOS Version 11.1 (Build 20C69)
Xcode 12.4 (17801) (Build 12D4e)
Timestamp: 2021-04-18T09:41:33+09:00

ソース

https://github.com/d-ike99/PoseNet_sample/tree/tmp/testCoreML

問題発生の流れ

1. 本アプリを立ち上げ「読込」ボタンを押下すると、写真アプリを立ち上げる
2. 任意の動画を選択すると、選択した動画に対する「骨格検出の処理」を呼び出す
該当ソース:37行目
補足:poseNet.predict(imageRef)の部分

swift

1 // poseNetによる解析 2 do { 3 for time_i in (0..<time.value) { 4 /// 画像初期化 5 let imageRef: CGImage 6 7 /// 取得対象の画像指定 8 tmp_time.value = min(time.value, time_i) 9 imageRef = try imageGenerator.copyCGImage(at: tmp_time, actualTime: nil) 10 11 /// PoseNet解析時(delegateで、poseBuilder生成時)用に、一時画像を保存 12 self.tmpCGImage = imageRef 13 14 /// 予測(結果は、delegateにて処理を委譲) 15 poseNet.predict(imageRef) 16 17 /// 解析状況通知 18 if time_i % progress_time == 0 { 19 let progress_per: Double = Double(time_i) / Double(time.value) * 100 20 print("(String(format: "%.2f%", progress_per))/ % 解析完了 ") 21 } 22 } 23 } catch { 24 throw APIError.generateImage("画像変換失敗") 25 }

3.骨格検出の解析を行う ←これの実施中に、「エラー事象」が発生する
該当ソース:51行目
補足: print("predict delegate called")が呼ばれていない

swift

1 func predict(_ image: CGImage) { 2 3 DispatchQueue.global(qos: .userInitiated).async { 4 5 // Wrap the image in an instance of PoseNetInput to have it resized 6 // before being passed to the PoseNet model. 7 let input: MLFeatureProvider = PoseNetInput(image: image, size: self.modelInputSize) 8 9 // 予測結果を格納する(prediction) 10 guard let prediction: MLFeatureProvider = try? self.poseNetMLModel.prediction(from: input) else { 11 return 12 } 13 14 let poseNetOutput = PoseNetOutput(prediction: prediction, 15 modelInputSize: self.modelInputSize, 16 modelOutputStride: self.outputStride) 17 18 DispatchQueue.main.async { 19 print("predict delegate called") 20 self.delegate?.poseNet(self, didPredict: poseNetOutput) 21 } 22 } 23 }

#補足
swift1年半で今更かもですが、先日メモリ管理においてweak(弱参照)が重要ということを知りました。

"3.骨格検出の解析を行う"でのソースが、メモリリークに該当する部分なのかな?
と思いつつもそこから何を調べていけば良いのか?わからない状況です。

もし、上記だけでは検討つけられない場合、調査方法などご提示いただくだけでも助かります。

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

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

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

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

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

guest

回答1

0

自己解決

解決策:「3.骨格検出の解析を行う」のソースで「DispatchQueue」を削除する
理由:
もともとこのコードは、PoseNetのサンプルプログラムを参考にしているのですが、カメラで撮影しながらリアルタイムで骨格検出を行っています。

カメラを起動しつつ、PoseNetによる解析を並行して実施する必要があるため「非同期処理」を実装していたのですが、私の実装コードでは非同期処理にする必要がないため「DispatchQueue」が不要であると考えました。

削除したところ、以下コードも無事呼ばれたことを確認しました。

print("predict delegate called")が呼ばれていない

本質問はクローズとさせていただきます。
ご回答いただきました方、大変ありがとうございました!

投稿2021/04/18 11:11

kazuhiro_ikeda

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問