2012-02-09 35 views
0

當使用儀器 - >活動監視器測試我的應用程序時,通過後退按鈕完成轉換時,我看到內存使用的差異,並遵循導航控制器與調用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

回答

2

pushViewController(如名稱所示)將UIViewController的新實例添加到導航控制器中,從而增加整體內存使用量。

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

如果在視圖控制器之後繼續推送視圖控制器,則最終會導致內存不足並崩潰。

反思您的導航。

+0

這就是發生了什麼事。我應該用什麼來代替pushViewController?此方法必須將用戶發送到屏幕保護程序視圖控制器,而不管當通知觸發時它們當前所處的視圖。 – BobbyScon 2012-02-09 20:26:35

+1

@BobbyScon使用'[self presentModalViewController:controller animated:YES];'顯示「screensaver」viewController和'[self dismissModalViewControllerAnimated:YES];'關閉它。不過從AppDelegate不起作用。通過'[navController topViewController];' – 2012-02-09 22:19:22

+0

@MatthiasBauch我可以實際將presentModal併入AppDelegate並且它可以工作,但是當調用dismissModal(在屏幕保護程序視圖內)時,它會讓你放棄你離開的地方而不是回到主屏幕。它確實解決了內存問題,只是不完全是我需要的成品。感謝您的意見,我會保留它爲未來的項目標記! – BobbyScon 2012-02-10 16:04:12

0

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

在考慮導航時,有時會用好的老式紙和鉛筆素描來繪製導航模型。

+0

謝謝!我確實畫出了這一個。我相信,我的導航非常準確,它只是屏幕保護程序的調用,它也會讓您回到主屏幕,讓我絆倒。這款應用程序適用於在博物館畫廊中全天候運行的自助服務終端,因此在經過一段時間沒有用戶互動之後,我基本上需要應用程序「重置」。剛剛實施了上面的更改,看起來我們很好走!沒有更多的內存積聚。再次感謝帖子! – BobbyScon 2012-02-10 16:17:04

相關問題