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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

457閲覧

背景動画によるメモリリーク対策

ShuyaOgawa

総合スコア17

メモリリーク

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/12/13 11:17

VideoSplashViewControllerを使って、iosアプリの起動した直後の画面の背景に動画を使用しています。その後、segueを使って、他のviewcontrollerに移動し、そこでの処理を終えたらまた始めの動画が背景の起動画面に戻ってきます。
ここで、この一連の動作を繰り返しているとメモリがめちゃくちゃ増えてしまいました。
背景動画を無しにするとメモリが増えないので原因がここにあるのは間違い無いと思います。
何か解決策がありましたらよろしくお願いします。
ちなみに、具体的なコードは次の通りです。

override func viewDidLoad() {
super.viewDidLoad()
setupVideo()
}

private func setupVideo() {
if let path = Bundle.main.path(forResource: "****", ofType: "mp4") {
let url = NSURL.fileURL(withPath: path)
videoFrame = view.frame
fillMode = .resizeAspectFill
alwaysRepeat = true
restartForeground = true
sound = false
startTime = 0.0
duration = 0.0
alpha = 0.7
backgroundColor = UIColor.black
contentURL = url
}
}

遷移方法は、カスタムセグエで
self.performSegue(withIdentifier: "SegueId", sender: self)
を使っております。

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

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

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

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

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

fromageblanc

2017/12/13 11:46

viewDidLoad外で動画を再生してるコードありませんか?あればそちらのが重要なんですが
ShuyaOgawa

2017/12/13 11:52

viewDidLoadでしか動画は再生していません。viewDidLoadでの動画再生の記述を消すと、どこにも動画は現れないので間違いではないと思われます。
guest

回答1

0

ベストアンサー

修正依頼に書きづらいのでこっちに書きます。

ちょっとソース眺めただけですが、VideoSplashViewControllerのviewDidAppearが呼ばれるたびにaddSubViewしているのが原因のような‥?

自分のViewControllerに下記のコードを追加して、遷移から戻ってくるたびに表示される数字が増えるかどうか確認してみて下さい。

swift

1override func viewDidAppear(_ animated: Bool) { 2 super.viewDidAppear(animated) 3 print(self.view.subviews.count) 4}

‥と言うのは嘘で、遷移から戻るときに、新しいインスタンスを生成して遷移していたのが問題でした。
dismiss(animated:completion:)戻るようにして解決。

投稿2017/12/14 00:32

編集2017/12/19 05:32
fuzzball

総合スコア16731

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

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

ShuyaOgawa

2017/12/14 15:06 編集

ご返信ありがとうございます。コントローラーにご返信いただいたコードを書いたのですが、カウントは4のままで遷移を繰り返しても同じでした。
fuzzball

2017/12/15 00:25

外れでしたか‥すみません。 ちなみに、書いたのは遷移元のViewControllerですよね?
ShuyaOgawa

2017/12/15 00:42

どちらにも書きました。 遷移もとは、4で遷移先は2で一定でした。なぜこの数字なのかはわからないのですが。
fuzzball

2017/12/15 00:56 編集

この数字は、self.viewにaddしているViewの数です。 遷移元の方で言うと、ムービーの他にボタンなどが3つ乗っていることになります。 実際に試してみようと思ったのですが、VideoSplashとVideoSplashKitと、同じようなのがありまして、どちらを使ってますか?
ShuyaOgawa

2017/12/15 01:05

podファイルを確認したらVideoSplashKitとなっていました。 https://dev.classmethod.jp/smartphone/iphone/video_splash_view_controller/のサイトを参考に作成しました。 self.view.subviews.countはのっかているviewの数なんですね。 self.view.subviews.countが増えないということは、遷移が繰り返されても背景動画が重なって再生されてないと思うのですが、viewContorllerが裏で走り続けその結果動画が繰り返されているということはあるのでしょうか?
fuzzball

2017/12/15 08:33

>>遷移が繰り返されても背景動画が重なって再生されてないと思う はい、その通りです。(同じインスタンスをaddSubViewしているので実際には追加されていませんでした) で、こちらで試してみたのですが、残念ながら再現しませんでした。 Instrumentsでも見てみましたが、メモリリークはありませんでした。 他の動画ファイルで試してみるとか、遷移先を空っぽのViewControllerにしてみるとか、もう少しVideoSplash以外のところを疑ってみるともいいかも知れません。
ShuyaOgawa

2017/12/16 12:25

わざわざ時間を割いていただいていただきありがとうございます。まだ治らないのですが、もう何日か時間をかけて解決方法を見つけたい思います。。。
ShuyaOgawa

2017/12/19 03:49

再び質問してしまい申し訳無いのですが、遷移元、遷移先とともに遷移方法が質問に記した通りにカスタムセグエで種類はPresent Modalyなのが原因だったりしますか?UI ButtonがないのでExitと紐付けていません。
fuzzball

2017/12/19 03:54

戻るときはどうしているのでしょうか? もしかしてインスタンスを生成して遷移してたりします? それならメモリが増えていくのは当たり前ですが‥。
ShuyaOgawa

2017/12/19 04:18

戻るときも同様にある条件後にself.performSegue(withIdentifier: "SegueId2", sender: self)使ってコード上で遷移しています。 確認したところUITransitionViewが遷移を繰り返すごとに増えていました。 恥ずかしながらプログラミングを始めて数ヶ月程度のど素人でして「インスタンスを生成して遷移」の意味が半分わかって半分わかっていません。 遷移したら遷移元のインスタンスは初期に定義したものに戻るため、遷移先から遷移元に戻ったら自動的にインスタンスは複数生成されずにリセットされるものと思っていました。 UIButtonがなくコード上で遷移させ、遷移するたびにインスタンスを生成させない方法はどのようなものがあるでしょうか。
fuzzball

2017/12/19 04:33 編集

「インスタンスを生成して遷移」は、新しいViewControllerを生成して、そこに遷移するということ、「戻る」というのは、現在のViewControllerを閉じて(破棄して)、元のViewControllerに戻るということ、です。遷移元のインスタンスは初期化されたり破棄されたりすることはなく、ずっと残ったままです。 コードによる「戻る」の方法ですが、dismiss(animated:completion:) を使って下さい。 https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss
ShuyaOgawa

2017/12/19 05:21

dismiss(animated:completion:)を使うことによりメモリリークすることなく遷移することができました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問