4

このトピックに関する多くの議論が行われていることを知っています。しかし、すべての議論では、すべて2つのビューコントローラ(A & B)と議論しています。私のシナリオは似ているが違う。View Controller全体で複数のpresentViewControllerメソッドを呼び出すと、iOSでメモリリークが発生しますか?

A、B、C、Dなどの複数のビューコントローラがある場合はどうなりますか?したがって、提示フローは次のように動く。

View Controller A(Home)は、View Controller B(List)を提示する。次に、View Controller BからView Controller C(詳細)が表示されます。View Controller CからView Controller D(Advanced Details)が表示されます。その後、View Controller DからView Controller Aが表示され、Homeに直接ナビゲートします。

そのためのベストプラクティスは何ですか?

+0

は、アプリの構造上のビットより多くのデータを教えてください。あなたはナビゲーションコントローラを使用していますか?ストーリーボード? ?ビュー階層はどのようなものですか? SwiftまたはObj-C? – CaptJak

+0

あなたは 'UITabBarController'を使用していますか?これは、すべてのビューコントローラを1つずつ表示するのに便利です。 – atulkhatri

+0

@atulkhatriデザインが異なるためTabBarを使用していません。 –

答えて

-3

を新しく作成した場合は表示されません。ビューコントローラ。

+0

しかし、最終的なアクションが発生するたびに、1つまたは複数のオブジェクトが既に生きているときに、新しいオブジェクトAを作成しています。 –

+0

ビュー階層から同じオブジェクトを使用しない限り、作成するオブジェクトの数は関係ありません。 – kirander

+0

それで、いつ新しいオブジェクトを表示しているときにそれらのオブジェクトが解放されるのでしょうか? –

3

プロジェクトの構造や、A、B、C、D、E、Fをどのように表示し、次にFからAに戻すかの詳細がわからない場合、私は野生の推測をして、あなたのUIViewControllerに採用しているデザインパターンに応じてリークが発生します。あなたの質問で@CaptJakがコメントしたように、特に、ビューコントローラの周りにデータを渡すために委譲パターンを使用する場合、メモリリークを引き起こすかどうか、方法および時期を判断するのは難しいです。

個人的には、複数のUIViewControllerを提示するなどの複雑なフローを実行して、いくつかの画面に戻る必要がある場合は、スタック上にビューをポップしません。ナビゲーションコントローラを使用しています)、モーダルで表示されている場合はView Controllerを終了し、使用している場合はSeguesを巻き戻します。ここでのリスクは、ビューコントローラのメモリが割り当て解除されている可能性があります。

私はコメントしましたが、十分な評判はありません。私がiOS開発でまだかなり新鮮なので、塩の粒で私の答えを取る。

編集:あなたのアプリケーションの流れで提供された詳細をありがとうございます。 presentViewControllerを使うことができるので、あなたはNavigationControllerで動いていると仮定していますか?その場合は、AからDを再度表示する代わりに、popToViewControllerまたはpopToRootViewController(Aがルートビューコントローラの場合)を使用します。 AがDから再び提示された場合、私はあなたのVCスタックに2つのインスタンスがあり、メモリリークを引き起こす可能性があると推測しています。

PopToViewController方法

NSArray arrayOfVCs = self.navigationController.viewControllers; 
for(UIViewController *currentVC in arrayOfVCs) 
{ 
    if([currentVC isKindOfClass:[ViewControllerA class]) 
    { 
     [self.navigation.controller popToViewController:currentVC animated:YES] 
    } 
} 

(Aは、ナビゲーションコントローラでのルートビューであると仮定した場合)PopToRootViewController方法

[self.navigationController popToRootViewControllerAnimated:YES] 

EDIT 2016年4月12日

私は持っていますこの質問をあまり考えて、私は実際にその上で短いRnDを行い、ここで私の発見を共有したいと思っています。私は非常にシンプルなアプリケーションで今までに提示されたすべてのモーダルビューコントローラのスタックを得るために、単純で汚い関数を作りました。

私はA→B→C→B→C→Bから約20~30回試験しました。たびに私はB - > Cの時間を過ごすと、メモリは0.5MB増加しました(私の画面はシンプルですが、あなたとは異なるかもしれません)、20MB以上から50MB以上になりました。この機能で

私は配列で提示ビュースタックのコントローラとも自分の名前の数を記録しました。これまでのところ私のために働いたが、あなたはそれを試してみて、それがあなたのために働くかどうか見ることができる。

//global variables 
var vccount = 0 
var vcnamelist = [String]() 

func getPresentingViewStackCount(currentVC : UIViewController!){ 
     if(currentVC.presentingViewController != nil){ 
      vccount = vccount + 1 
      let vc = currentVC.presentingViewController 
      vcnamelist.append(NSStringFromClass((vc?.classForCoder)!)) 
      getPresentingViewStackCount(vc) 
    } 
} 

// to use 
func someRandomMethod(){ 
getPresentingViewStackCount(self) 
} 

でも、ナビゲーションコントローラを使用するのが最も良いと思います。それは彼らのために作られたものです。 :)

+0

私はさらに説明を追加しました –

+0

私はナビゲーションコントローラを使用していません! –

+0

ViewControllerはすべてモーダルで表示されますか?その場合、ViewController AまでView Controllerを閉じる方法を見つける必要があると思うかもしれません。あるいはNavControllerにViewController Aを埋め込み、ViewController Dを表示した後、 '[self.navigationController dismissViewController:YES] '。 NavigationControllerは、このようなスタックを処理する場合に便利です。 – rach

0

私は適切にナビゲートするようにあなたが次に、本にしたいビューコントローラにUIButton(または、あなたの流れを制御するために使用している他の何でも)から+ドラッグを指揮することが可能であると考えています。それから、あなたは手放して、あなたが望むプレゼンテーションの方法を選択し、試してみるとうまくいくはずです。私はこれにXCodeを使用していると仮定しており、他の開発アプリケーションについてはわかりません。

これが起こるのメモリリークを防止するために設計されていますが、それぞれ別々のビューコントローラ用に別のファイルを作成する必要がありますのでご注意ください。他のマニュアル形式の切り替えでは、状況に応じてメモリリークが発生する可能性があります。

1

あなたはA-> B-> C-> D-> A、一つずつ、次のように提示1.If、互いの上に、あなたは例外が発生します:

アプリケーションを試してみましたモーダルアクティブコントローラを表示する

既にUINavigationControllerのスタックにあるViewControllerをプッシュできないように、すでに表示されているViewControllerを表示することはできません。アプリを構築するためにストーリーボードを使用2.Ifは

、あなたはあなたのアプリケーションを構築するために、コードを使用3.IfはD.

からAに戻ってジャンプする-セグエをほどく使用することができ、あなたは、弱い参照を保持することができますDでAの、およびdismissViewControllerAnimatedとしてのViewController Dに

[A dismissViewControllerAnimated:YES completion:nil]; 

を呼び出すことは、あなたがAに戻ってみましょう

- (ボイド)dismissViewControllerAnimated:(BOOL)フラグ完了:(無効(^ __nullable) (空))完了;
複数のビューコントローラを連続して表示して、表示されたビューコントローラのスタックを構築する場合、スタック内のビューコントローラでこのメソッドを呼び出すと、その直下の子ビューコントローラとその子の上のすべてのビューコントローラがスタック上に閉じられます。これが起こると、一番上のビューだけがアニメ化されて消滅します。いずれの中間ビューコントローラもスタックから単に除去される。一番上のビューはモーダルトランジションスタイルを使用して閉じられ、スタック内の他のビューコントローラで使用されるスタイルとは異なる場合があります。

関連する問題