當使用儀器 - >活動監視器測試我的應用程序時,通過後退按鈕完成轉換時,我看到內存使用的差異,並遵循導航控制器與調用AppDelegate中使用pushViewController
的方法。如果導航由導航後退按鈕完成,那麼內存使用會下降(我是iOS編程的新手,但我相信這個術語是它釋放了特定控制器的子視圖)。如果我使用AppDelegate中使用pushViewController
的方法遠離該視圖控制器,則內存不會被釋放,並且如果您返回到該視圖控制器,它將再次開始疊加。我正在爲iOS5編寫XCode 4.2。導航控制器中的後退按鈕是否可以實現pushViewController不支持的功能?
這是在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)的滾動視圖推送UIViewController。該子視圖還有一個子視圖(B)和一個關閉按鈕。點擊關閉按鈕並從子視圖中刪除子視圖(B)。點擊左上角的後退按鈕,返回主頁面。如果您在一段時間後沒有用戶交互,上面的方法會觸發並將您發送到screenSaverViewController。觸摸屏幕保護程序中的任何位置,然後返回主頁面。
在觀看活動監視器時,每當子視圖(B)出現時,正在使用的實際內存使用情況窗口中報告的內存量增加,但在下一個按鈕後纔會下降,並返回Main頁。如果屏幕保護程序啓動,那麼它根本不會關閉。
使用任一方法,viewWillDisappear和viewDidDisappear都在scrollview控制器中觸發。爲什麼一個釋放內存,另一個不釋放?
我所有的導航工作,這只是一個內存使用問題,我需要幫助。
追問:
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?此方法必須將用戶發送到屏幕保護程序視圖控制器,而不管當通知觸發時它們當前所處的視圖。 – BobbyScon 2012-02-09 20:26:35
@BobbyScon使用'[self presentModalViewController:controller animated:YES];'顯示「screensaver」viewController和'[self dismissModalViewControllerAnimated:YES];'關閉它。不過從AppDelegate不起作用。通過'[navController topViewController];' – 2012-02-09 22:19:22
@MatthiasBauch我可以實際將presentModal併入AppDelegate並且它可以工作,但是當調用dismissModal(在屏幕保護程序視圖內)時,它會讓你放棄你離開的地方而不是回到主屏幕。它確實解決了內存問題,只是不完全是我需要的成品。感謝您的意見,我會保留它爲未來的項目標記! – BobbyScon 2012-02-10 16:04:12