viewWillDisappear, viewWillUnload viewDidUnload никога не е извикван

Методите на моя основен viewController viewWillDisappear, viewWillUnload viewDidUnload никога не се извикват (имам отчети за журнал във всеки).

Изглежда, че това се е случвало и преди тук, но отговорите не са напълно ясни. Това изглежда предполага, че изгледът на viewController трябва да бъде вграден в UINavigationController, което изглежда странно и не е нещо, което съм виждал споменато никъде другаде.

viewWillDisappear и viewDidDisappear никога не се извикват

Ако случаят е такъв, къде другаде мога да направя известно почистване и да се уверя, че моите промени в UIDocument ще бъдат запазени?

РЕДАКТИРАНЕ: Предполагам, че съм разбрал погрешно @ как работят събитията на root viewController (това е уникален статус и т.н.). Ще разгледаме методите на AppDelegate. Просто се опитвам да се уверя, че моите UIDocument неща се запазват и също така, че моите Core Audio неща се затварят правилно.

Затваряне: В крайна сметка отиде с известия, публикувани от AppDelegate. Изглежда, че работи доста добре + прости неща, след като го направите веднъж.

// от appDelegate

- (void)applicationDidEnterBackground:(UIApplication *)application
{

[[NSNotificationCenter defaultCenter] postNotificationName: @"handleCleanup" 
                                                    object: nil 
                                                  userInfo: nil];
}

и моят VC се регистрира за известието:

    [[NSNotificationCenter defaultCenter] addObserver: self 
                                         selector: @selector(saveAndCleanup) 
                                             name: @"handleCleanup" 
                                           object: nil];

person spring    schedule 02.04.2012    source източник


Отговори (2)


Ако това е вашият основен изглед и никога не го променяте - тогава той няма да изчезне. Въпреки че viewWillDisapear може да бъде извикан, когато поставите приложението си на заден план - не мога да си спомня.

Вашият контролер за изглед ще се разтовари само ако получите предупреждение за паметта, но ако е на екрана - няма да се разтовари.

viewWillDisappear:

Този метод се извиква в отговор на премахване на изглед от йерархия на изглед. Този метод се извиква преди изгледът действително да бъде премахнат и преди да бъдат конфигурирани анимации.

viewDidUnload:

Когато възникне състояние на недостиг на памет и изгледите на текущия контролер на изгледа не са необходими, системата може да избере да премахне тези изгледи от паметта. Този метод се извиква, след като изгледът на контролера на изгледа е освободен и е вашият шанс да извършите окончателно почистване. Ако вашият контролер на изглед съхранява отделни препратки към изгледа или неговите подизгледи, трябва да използвате този метод, за да освободите тези препратки. Можете също да използвате този метод, за да премахнете препратки към всички обекти, които сте създали, за да поддържате изгледа, но които вече не са необходими сега, когато изгледът е изчезнал. Не трябва да използвате този метод за освобождаване на потребителски данни или друга информация, която не може лесно да бъде пресъздадена.

person bandejapaisa    schedule 02.04.2012
comment
дох! Това има смисъл. Тествам в симулатора и очаквах да видя тези събития за изглед да се задействат. Изглежда, че AppDelegate е правилното място за моето почистване. - person spring; 02.04.2012

Типично място за освобождаване на ненужен кеш или ресурси е - (void)didReceiveMemoryWarning. Ако не сте го направили в този метод, iOS може да избере да убие приложението ви, когато паметта му липсва.

Като се има предвид естеството на мобилните приложения, трябва да записвате възможно най-често. Типичното изпълнение използва таймер за автоматично запазване. Понякога се получава обаждане, iOS може да избере да затвори приложението ви, вместо да го постави на заден план, защото използвате много памет.

Друга бележка, когато се извика - (void)didReceiveMemoryWarning, е сигурно, че вашият изглед ще бъде разтоварен. Това обаче не означава, че приложението ще бъде убито. Това означава, че следващия път, когато приложението бъде отворено, viewDidLoad ще бъде извикано отново. В този смисъл можете да опитате да запазите файла по този метод.

person He Shiming    schedule 02.04.2012