簡體   English   中英

導航控制器中的后退按鈕與pushViewController沒有什么關系?

[英]What does the back button in a navigation controller do that pushViewController doesn't?

當使用Instruments - > Activity Monitor測試我的應用程序時,我看到通過后退按鈕完成轉換並跟隨導航控制器與調用AppDelegate中使用pushViewController的方法時內存使用的差異。 如果通過導航后退按鈕完成導航,則內存使用會下降(我是iOS編程新手,但我相信這個術語是它正在發布該特定控制器的子視圖)。 如果我通過使用appDelegate中使用pushViewController的方法離開該視圖控制器,那么內存不會被釋放,如果你回到那個視圖控制器,它會再次開始加起來。 我正在為iOS5編寫XCode 4.2。

這是AppDelegate中的方法:

-(void)applicationDidTimeout:(NSNotification *) notif
{
    UIViewController *controller = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"slideShow"];

    [[UIScreen mainScreen] setBrightness:0.0];
        NSLog(@"go home");
        [(UINavigationController *)self.window.rootViewController pushViewController:controller animated:YES];
}

應用程序流程如下:主頁面有4個按鈕。 按鈕1使用具有子視圖(A)的scrollview推送UIViewController。 該子視圖還有一個帶有關閉按鈕的子視圖(B)。 點擊關閉按鈕,從超級視圖中刪除子視圖(B)。 點擊左上角的后退按鈕,返回主頁面。 如果在一段時間后沒有用戶交互,則上面的方法將觸發並發送給screenSaverViewController。 觸摸屏幕保護程序中的任意位置,然后返回主頁面。

在觀察活動監視器時,每次出現子視圖(B)時,“實內存使用情況”窗口中報告的內存量會增加,但在您點擊后退按鈕並返回主頁面之前不會下降。 如果屏幕保護程序啟動,那么它根本不會消失。

使用任一方法,viewWillDisappear和viewDidDisappear都會在scrollview Controller中觸發。 為什么一個釋放內存而另一個沒有?

我的所有導航都有效,這只是我需要幫助的內存使用問題。

跟進:

picciano指出了我沒有看到的東西 - pushViewController做了它的功能。 在現有視圖之上推送視圖。 任何人都可以建議正確替換pushViewController? 該方法必須從AppDelegate觸發,以便應用程序在通知觸發時從任何視圖導航到屏幕保護程序。

解決了:

我最終做的是將導航從AppDelegate移動到各個視圖控制器。 我確保#import "Timer.h"並將我的通知監聽器添加到viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil]; 然后添加了applicationDidTimeout:方法:

-(void)applicationDidTimeout:(NSNotification *) notif
{
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
}

1,在這種情況下,是我的屏幕保護程序控制器。 0 =根視圖。 這些數字跟隨導航堆棧。 root view (0) -> screen saver (1) -> main page (2) -> 1 of 4 other pages

pushViewController(顧名思義)將UIViewController的新實例添加到導航控制器中,增加了整體內存使用量。

相反,后退按鈕從導航控制器中刪除頂部UIViewController並釋放內存。

如果在視圖控制器之后繼續推送視圖控制器,最終將耗盡內存並崩潰。

重新思考你的導航。

另一個可能的解決方案是查看一些用於添加,刪除或交換子視圖的UIView方法。

在考慮導航時,有時候好的舊式紙和鉛筆素描對您的導航模型有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM