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

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

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

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

Q&A

解決済

2回答

3356閲覧

TOP画面遷移時の解放について

yukatin

総合スコア1

Swift

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

0グッド

0クリップ

投稿2020/04/23 18:04

編集2020/04/23 19:30

はじめまして。
swiftの画面の解放について、よく分からないので教えて下さい。
具体的なソースコードはありません。

今回PUSH通知を実装するのですが、PUSH通知を受け取った時に、PUSH通知の内容に合う画面を表示したいと思っています。

前提条件として、ソースはすべてコードで記載、画面遷移はUINavigationControllerのpushViewControllerを使用しています。

ユーザがTOP画面、そこからA→B→Cの画面へと遷移していたとします。
その後、PUSH通知から起動する時に、一旦TOPへ戻り、D画面へと進みたい場合、popToRootViewControllerでTOPに戻ろうと思うのですが、その際にAとBの画面が解放されない事が気になります。

(回答者様からのご指摘で追記)TOP→A→B→Cと遷移しますが、ユーザの操作で逆向きに戻る仕様(popViewControllerで戻る)になっているため、A→B、またはB→Cでの遷移の際にAやBのDisappearは呼んでいません(UIは解放していません)。

情報が古いのかもしれないのですが、画面を閉じる際はメモリリークが心配なため、addsubViewしたUIをすべてremoveFromSuperviewしています。

しかし、最新のswiftでは解放などの考えは不要でしょうか?それともpopToRootViewControllerをした場合、すべて解放などもされるようになっている
のでしょうか?
ちなみに、CはviewWillDisappearが呼ばれ、removeFromSuperviewが可能ですが、
AとBの画面はviewWillDisappearは呼ばれません。

どなたか、このあたりの事に詳しい方がいらっしゃいましたら、教えて頂けると助かります。よろしくお願いいたします。

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

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

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

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

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

hoshi-takanori

2020/04/23 21:15

Swift では (Objective-C ARC でも) 循環参照を除いてメモリーリークの心配は不要なはずです。addSubview したものは大元の view が解放される時に一緒に解放されるので、removeFromSuperview する必要はありません。
yukatin

2020/04/23 23:52

hoshi-takanori様 ご回答ありがとうございます。やはりそうなのですね。ズバリ知りたい事を教えて頂き、助かりました。ありがとうございました。
hoshi-takanori

2020/04/24 00:37

というか、removeFromSuperview はビュー階層からビューを取り除くためのメソッドであり、ARC 以前の Objective-C も含めて、「メモリーリークを防ぐために removeFromSuperview する」なんて事はありえないです。addSubview したものは親ビューが管理するので、親ビューが解放される時にはサブビューも解放されます。ViewController 側で強参照を持っていればそれを適切に release するのは ViewController の責務ですが、ARC や Swift では普通にコードを書けば自動的に解放されるはずです。
yukatin

2020/04/24 19:18

お返事遅くなりました。 そうなのですね、私が開発を始めたばかりのObjective-Cの頃はメモリリークを検出すると確かにあり(これだけが原因ではなかったと思いますが)、ネットにも普通に書かれていたので、その情報をいつまでも信じていました。 詳しく教えて頂き、ありがとうございました。
guest

回答2

0

ベストアンサー

その際にAとBの画面が解放されない事が気になります。

メモリリークを検出する機能がXcodeにはいくつかありますので、そういった機能を使って調べてください。

基本的にはARCならば(循環参照していなければ)勝手にメモリを回収するようになっていますので、
removeFromSuperviewの必要はありません。

投稿2020/04/23 23:41

takabosoft

総合スコア8356

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

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

yukatin

2020/04/23 23:49

talabosoft様 ご回答ありがとうございます。 やはりそうなのですね。ズバリ知りたい事を教えて頂き、助かりました。 はい、早速メモリリークを検証したいと思います。ありがとうございました。
guest

0

showで遷移しているので、TopABCCを表示している場合には、
TopABは既にdisappear系のメソッドが呼ばれている状態なので、
そこからTopに戻った場合に、呼ばれるのはCdisappear系メソッドだけでいいのではないのでしょうか?

画面を閉じる際はメモリリークが心配なため、
addsubViewしたUIをすべてremoveFromSuperviewしています。

↑これについては、私はviewDidDisappear(_:)で開放済みだと思っています。
Notifies the view controller that its view was removed from a view hierarchy.とは書いてありますが、詳しくは理解してないので、わかりません。

投稿2020/04/23 18:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yukatin

2020/04/23 18:51

tyobigorou様 深夜にも関わらず、早速のご回答ありがとうございます。 説明不足があり、大変失礼しました。 TOP→A→B→Cと遷移する際に、OKボタンやバツボタンタップで前画面に戻りますので、次画面へ遷移した時にDisappearは呼んでいません。PUSH通知さえなければ、画面が遷移してもユーザの操作でTOPへ戻る仕組みになっています。 なので、AとBは解放される事なく待っている状態です。 やはり、このあたりはよく分からないですよね。動きとして正しい事が確認でき、助かりました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/04/23 19:10 編集

>>TOP→A→B→Cと遷移する際に、OKボタンやバツボタンタップで前画面に戻ります ?? 戻る?進む?両方? navigationControllerの下にあるViewController間でshow/pushViewControllerで遷移する場合は、表示していないViewControllerは自分でdisappearを呼ばなくても勝手に呼ばれて、hierarchyからも消えるけど、違うこと言ってるのかな?
yukatin

2020/04/23 19:26

1つ前の画面に戻る際は、popViewControllerで戻っています。進んではいない認識です。 ただA→Bへの遷移の際にDisappear系は一切記載していないので、自動で呼ばれていてもUIの解放など(removeFromSuperview)はしていません。戻りたいので、次画面への遷移の際にUIなどはあえて解放していない仕様です。 今のswiftがaddsubViewをしたUIを放置しても大丈夫なのであれば、popToRootViewControllerしてしまってOKとしたいのですが、その辺りがなんともでして。またユーザの操作で何度もAやBが呼ばれますので、PUSH通知を挟む度に解放しないメモリがたまる事を危惧しています。
退会済みユーザー

退会済みユーザー

2020/04/23 19:48

あーすいません、コードベースですね。 私はstoryboardベースなので、わかんないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問