2015-09-30 13 views
5

I UIPageViewControllerを設定して、一部のビューコントローラを前後に移動します。私は、ビューコントローラがUIPageViewControllerにコンパイラが私にReceived memory warningを与えるまでメモリ使用量が増加し、その後アプリがメモリを空にして再びうまく動作するまであまりにも遅く実行されるまで問題が発生する。メモリを増やさずにビューコントローラをナビゲートするにはどうすればよいですか?または新しいコメントが追加されたときに、どのように現在のView Controllerを削除できるかを言うのがよいでしょう。ここに私のコードは次のとおりです。UIPageViewController現在のビューコントローラ

// Create the page view controller. 
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
self.pageViewController.dataSource = self; 


//disabling tap and swipe guesture 
for (UIGestureRecognizer *recognizer in self.pageViewController.gestureRecognizers) { 
    recognizer.enabled = NO; 
} 


// Instantiate the first view controller. 
UIViewController *startingViewController = [self viewControllerAtIndex:0]; 

[self.pageViewController setViewControllers:@[startingViewController] 
            direction:UIPageViewControllerNavigationDirectionForward 
            animated:NO 
           completion:^(BOOL finished) { 
            // Completion code 
           }]; 

// Add the page view controller to this root view controller. 
[self addChildViewController:self.pageViewController]; 
[self.view addSubview:self.pageViewController.view]; 
[self.pageViewController didMoveToParentViewController:self]; 

前後の行動:

- (void)goToPreviousContentViewController 
{ 

    // Get index of current view controller 
    UIViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0]; 
    NSString *vcRestorationID = currentViewController.restorationIdentifier; 
    NSUInteger index = [self.contentPageRestorationIDs indexOfObject:vcRestorationID]; 

    UIViewController *previousViewController = [self viewControllerAtIndex:index - 1]; 



    [self.pageViewController setViewControllers:@[previousViewController] 
             direction:UIPageViewControllerNavigationDirectionReverse 
             animated:NO 
            completion:^(BOOL finished) { 
             // Completion code 
            }]; 
} 

もっとコード:

#pragma mark - UIPageViewControllerDataSource 
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return self.contentPageRestorationIDs.count; 
} 





- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSString *vcRestorationID = viewController.restorationIdentifier; 
    NSUInteger index = [self.contentPageRestorationIDs indexOfObject:vcRestorationID]; 

    if (index == 0) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index - 1]; 
} 




- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSString *vcRestorationID = viewController.restorationIdentifier; 
    NSUInteger index = [self.contentPageRestorationIDs indexOfObject:vcRestorationID]; 

    if (index == self.contentPageRestorationIDs.count - 1) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index + 1]; 
} 






#pragma mark - Private Methods 
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    // Only process a valid index request. 
    if (index >= self.contentPageRestorationIDs.count) { 
     return nil; 
    } 

    // Create a new view controller. 
    BaseContentViewController *contentViewController = (BaseContentViewController *)[self.storyboard instantiateViewControllerWithIdentifier:self.contentPageRestorationIDs[index]]; 

    // Set any data needed by the VC here 
    contentViewController.rootViewController = self; 

    return contentViewController; 
} 

答えて

1

私はあなたのコード内の任意のメモリの問題が表示されません。 「Leaks」と呼ばれるプロファイラツールを使用して、メモリから解放されなかったオブジェクトを見つけようとしてください。 その

6

ためofficial Apple guide

  1. あなたの質問に答えるためにそこにある「どのように私はメモリを増やすことなく、ビューコントローラを介してナビゲートすることができますか?」:

    あなたが本当にそれを行うことはできません。新しいビューコントローラを読み込むと、そのビューのすべてがロードされ、ビューコントローラはメモリに保存されます。メモリにないビューコントローラをロードして表示することはできません。

  2. 「に新しいが追加したときにどのように現在のビューコントローラを削除することができます」:

    あなたはそれを行うべきではありません。空のビューコントローラに大きなメモリフットプリントがない場合は、メモリの問題なしにナビゲーションスタックに20以上のビューコントローラを簡単に配置できます。このようなものを実装することは可能ですが、それは多くの作業を必要とし、問題の根本を解決しません。

何が問題なのですか?

メモリ管理に問題があります。あなたが投稿したコードに起因するものではありません。問題はコードの別の部分にある必要があります。

メモリ管理の問題が発生する可能性があり、2つの一般的な例があります。

  1. はサイクルを保持: Aは、2つのオブジェクトがお互いを保持する際のサイクルは、本質的に保持します。これは、オブジェクトの所有権の標準規則に反するため、オブジェクトを解放して他のオブジェクトを解放することができず、メモリリークが発生します(番号は保持カウントです)。

  2. 不要なキャッシング:画像をキャッシングしてキャッシングすることは、キャッシングの理想的なユースケースではありません。キャッシングは、頻繁にアクセスされるオブジェクトを格納するのに理想的です。これらのイメージに頻繁にアクセスしない場合、またはdidReceiveMemoryWarningメッセージを受信する場合は、これらのオブジェクトを解放する必要があります。

はどのようにメモリがする

最初の最も簡単なものを発行し、ビューコントローラのdeallocメソッドをオーバーライドすることでデバッグすることができます。ビューコントローラでdeallocメソッドをオーバーライドすると、ビューコントローラが期待どおりに割り当て解除されるようになります。

-(void)dealloc { 
    NSLog(@"viewcontroller is being deallocated"); 
} 

これは、問題を特定し、Xcode Instrumentsでデバッグすることができます。 This記事はあなたにとって良いスタートになるかもしれません。

+0

私が何かをダウンロードしませんが、あなたのアドバイスのためのおかげで、私はそれを –

3

メモリを回避し、ビューコントローラを管理するには、すべてのビューコントローラをコンテナにスタックする必要があります。

その次の/前のすべてのコールがそのコンテナで行われ、必要に応じて提供されるようにします。また、このコンテナのもう1つの利点は、コントローラーを何度も再初期化することを避けることです。

コンテナにView Controllerを追加したら、initを割り当てるか、そのコントローラを2回目に初期化する必要はありません。

ここに貼り付けるのは大きなコードですが、ストーリーボードの設定も表示されません。だから私はあなたにビューコントローラを保持するためにコンテナとページコントローラを視覚化して使用するためのデモを共有します。

PageDemo

enter image description here

+0

チェックしますありがとう、あなたはそれぞれのビューコントローラのナビゲーションコントローラを設定したのですか?あなたの答えがYESならば、私のストーリーボードはより複雑になります!私は27のViewコントローラを持っています! –

+0

私はあなたのデバイスでプロジェクトをチェックして、結果は同じです!実際には私のコードがうまく動作し、メモリが空になってしまいました。メモリの警告を防ぎたいと思っていました。 –

+0

ここのことは、あなたの目的に合わせたビューコントローラです。ストーリーボードに27個のビューコントローラを作成する必要はないということです。ストーリーボードにコントローラを1つだけ作成し、ページの変更に合わせて詳細を変更します。 – Kampai

関連する問題