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

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

ただいまの
回答率

91.06%

  • Swift

    5899questions

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

  • Xcode

    3377questions

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

  • メモリリーク

    40questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 203

ShuyaOgawa

score 11

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)
を使っております。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • fromageblanc

    2017/12/13 20:46

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

    キャンセル

  • ShuyaOgawa

    2017/12/13 20:52

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/15 00:06 編集

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

    キャンセル

  • 2017/12/15 09:25

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

    キャンセル

  • 2017/12/15 09:42

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

    キャンセル

  • 2017/12/15 09:56 編集

    この数字は、self.viewにaddしているViewの数です。
    遷移元の方で言うと、ムービーの他にボタンなどが3つ乗っていることになります。

    実際に試してみようと思ったのですが、VideoSplashとVideoSplashKitと、同じようなのがありまして、どちらを使ってますか?

    キャンセル

  • 2017/12/15 10:05

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

    キャンセル

  • 2017/12/15 17:33

    >>遷移が繰り返されても背景動画が重なって再生されてないと思う
    はい、その通りです。(同じインスタンスをaddSubViewしているので実際には追加されていませんでした)

    で、こちらで試してみたのですが、残念ながら再現しませんでした。
    Instrumentsでも見てみましたが、メモリリークはありませんでした。

    他の動画ファイルで試してみるとか、遷移先を空っぽのViewControllerにしてみるとか、もう少しVideoSplash以外のところを疑ってみるともいいかも知れません。

    キャンセル

  • 2017/12/16 21:25

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

    キャンセル

  • 2017/12/19 12:49

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

    キャンセル

  • 2017/12/19 12:54

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

    キャンセル

  • 2017/12/19 13:18

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

    キャンセル

  • 2017/12/19 13:33 編集

    「インスタンスを生成して遷移」は、新しいViewControllerを生成して、そこに遷移するということ、「戻る」というのは、現在のViewControllerを閉じて(破棄して)、元のViewControllerに戻るということ、です。遷移元のインスタンスは初期化されたり破棄されたりすることはなく、ずっと残ったままです。

    コードによる「戻る」の方法ですが、dismiss(animated:completion:) を使って下さい。
    https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss

    キャンセル

  • 2017/12/19 14:21

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

    キャンセル

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

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

関連した質問

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

  • Swift

    5899questions

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

  • Xcode

    3377questions

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

  • メモリリーク

    40questions

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