Otrzymałem ostrzeżenie o pamięci. Level=1 Podczas wyświetlania interfejsu UIImagePickerController

To doprowadza mnie do szału!!!

Otrzymuję ostrzeżenie o odebraniu pamięci. Level=1 " ilekroć próbuję pokazać UIImagePickerController z Sourcetype = UIImagePickerControllerSourceTypecamera.

Oto kod z mojego viewDidLoad gdzie ustawiam rzeczy:

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Set card table green felt background
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];


    // Init UIImagePickerController
    // Instantiate a UIImagePickerController for use throughout app and set delegate
    self.playerImagePicker = [[UIImagePickerController alloc] init];
    self.playerImagePicker.delegate = self;
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}

A oto jak przedstawiam go modalnie ..

- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];

}

Wynik ... UIImagePicker zaczyna się pokazywać, a następnie boom ... Dostaję Ostrzeżenie... ZA KAŻDYM RAZEM! Co ciekawe, jeśli przełączę się na Sourcetype = UIImagePickerControllerSourceTypephotolibrary ... wszystko działa dobrze.

Co do cholery przegapiłem lub zrobiłem źle? Chcę tylko pokazać Aparat, zrobić i zapisać zdjęcie.

Dla twojej wiadomości-testuję na moim urządzeniu 3GS.

Dzięki wszystkim, którzy mogą pomóc:)

Author: wgpubs, 2010-06-23

7 answers

To jest bardzo często . Tak długo, jak radzisz sobie z ostrzeżeniem pamięci bez awarii i masz wystarczająco dużo miejsca, aby kontynuować, nie pozwól, aby doprowadzić cię do szaleństwa.

 17
Author: progrmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-23 05:37:51

Nie chodzi o to, ile pamięci zużyła Twoja aplikacja, ponieważ prawdopodobnie stanie się to nawet wtedy, gdy napiszesz bardzo prostą aplikację, która ma tylko jeden widok za pomocą jednego przycisku, klikając przycisk, a następnie otwórz kamerę. Testowałem na iPhone 3GS, iPad 2 i iPod touch 3G. stało się to tylko w iPhone 3GS. Odkryłem, że nie stanie się to więcej, jeśli ponownie uruchomisz urządzenie przed uruchomieniem aplikacji.

Innym realnym rozwiązaniem jest skomentowanie kodu [super didReceiveMemoryWarning], w Twoim viewController.

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

Po wielu testach na iPhone 3GS z iOS 4.3.2, stwierdziłem, że logika może się podobać: - >Otwórz tyle co aplikacja działająca w tle - >Prezentowanie imagepickera interfejsu UIImagePickerController, klikając "Wstecz" lub "zapisz" z imagePicker - >ApplicationDelegate ' s method, applicationDidReceiveMemoryWarning:(UIApplication *)application, will be called - >Wtedy zostanie wywołana metoda Viewcontrollera, didReceiveMemoryWarning: - >Then viewDidUnload - >Then viewDidLoad

Wtedy można było znaleźć niektóre widoki zostały zwolnione i bieżący widok została wskazana na nieoczekiwaną.

Domyślnie, [super didReceiveMemoryWarning] zostanie uruchomiony po wywołaniu metody ViewController didReceiveMemoryWarning. Nie będą wywoływane metody viewDidUnload: i viewDidLoad:. Oznacza to, że Ostrzeżenie mem zostało całkowicie zignorowane. Tego się spodziewaliśmy.

 6
Author: Navy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-29 09:45:16

Teraz po uaktualnieniu do 4.0 zdarza się również mojej aplikacji - wcześniej w 3.1 nie było żadnych ostrzeżeń.

Właściwie, jak mówiłeś wcześniej, nie powinno być problemu. Powoduje to jednak, że widok, który pojawia się po nim, ładuje się ponownie i jest wywoływany viewDidLoad. To psuje moją aplikację, ponieważ inicjalizuję widok w viewDidLoad - teraz zostaje zainicjowany od nowa-nawet jeśli nie powinien.

Jako komentarz, może się to zdarzyć również w wielu innych aplikacjach, które polegają na wczytywaniu Zobacz tylko raz!

 5
Author: user387184,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 19:34:49

Zdarzyło się to w mojej aplikacji, czy zrobiłem to również na iOS 4.0. Nie było to spójne, ale najczęstszą przyczyną było utworzenie instancji UIImagePickerController i przejście do jakiegoś dużego zdjęcia przechowywanego w jednym z albumów.
Fixed by persisting state in the didReceiveMemoryWarning method, and loading from state in the viewDidLoad method. Jednym z zastrzeżeń jest pamiętanie o wyczyszczeniu pliku stanu w odpowiednim punkcie dla Twojej aplikacji. Dla mnie było to opuszczenie odpowiedniego kontrolera UIViewController w normalnych okolicznościach.

 4
Author: DenTheMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-17 17:27:38

Otrzymuję również ostrzeżenie o pamięci podczas otwierania interfejsu UIImagePickerController. Ja też jestem na 4.01. Ale dodatkowo, UIImagePickerController uruchamia animację zamkniętej migawki i tam gra na zwłokę, z zamkniętą migawką na ekranie.

Wygląda na to, że zachowanie UIImagePickerController na ostrzeżeniach pamięci polega na zamknięciu się. Mógłbym odrzucić UIImagePickerController z nadrzędnego ViewController w metodzie didReceiveMemoryWarning, ale to sprawiłoby, że straszne doświadczenie użytkownika.

Czy ktoś widział ten problem? Czy istnieje sposób, aby obsłużyć Ostrzeżenie pamięci tak, że UIImagePickerController nie wyłączy się?

 1
Author: eddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 19:15:03

Od kilku dni zmagam się z tym samym problemem. Jednak Resetowanie mojego iPhone ' a 4 (Usuwanie pamięci) rozwiązuje problem, więc tak naprawdę nie jest to problem z aplikacją.

Wygląda na to, że ostrzeżenie o pamięci poziomu 1 lub 2 wyzwala delegata UIimgPickerController do odciążenia się. To samo dzieje się w mojej aplikacji z delegatem delegata (tak, może). Jednak po ostrzeżeniu o pamięci, załaduje on delegata (i jest nim delegat) ponownie powodując, że viewDidLoad uruchomi dowolny kod, który tam jest.

Nie jestem pewien, czy dzieje się to tylko podczas korzystania z UIimgPickerController, ponieważ testowanie tego wszystkiego jest bardzo czasochłonne.

Mógłbym napisać jakiś dodatkowy kod, aby zapobiec wykonaniu kodu w viewDidLoad en viewWillAppear podczas pokazywania interfejsu UIimgPickerController, ale to nie jest Klasyczne, prawda?

Tu można pomyśleć: może być że kończy ci się pamięć ponieważ testujesz swoją aplikację. Z niektóre memoryleaks jest bardzo dobrze. możliwe, że pracujesz nad ten problem za każdym razem, gdy debugujesz.

 1
Author: Jaap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-28 12:55:55

The UIImagePickerControllerDelegate jest Wieprzem pamięci, ponieważ rejestrujesz duże zasoby pamięci, czy to obraz, czy wideo. Więc od początku pamiętaj, aby określić ustawienia przechwytywania medium, jako punkt początkowy, zmniejsz to, jeśli nie potrzebujesz Jakości:

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.videoQuality=UIImagePickerControllerQualityTypeMedium;

Następnie po przechwyceniu i użyciu tych aktywów. Usuń wszystkie pliki tymczasowe z folderu Temp aplikacji. Może to być dodatkowy obsesyjny krok, ale to dobry nawyk: {]}

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[lastCapturedFile substringFromIndex:7] ]) {
    NSError *error;
    // Attempt to delete the folder containing globalDel.videoPath
    if ([fileManager removeItemAtPath:[lastCapturedFile substringFromIndex:7] error:&error] != YES) {
        NSLog(@"Unable to delete recorded file: %@", [error localizedDescription]);
    } else {
        NSLog(@"deleted file");
    }
}

Powyżej jest wyczyszczenie pliku, który został utworzony przez delegata. W niektóre przypadki transkodowania lub tworzenia własnych zasobów usuwają folder z tym plikiem. Uwaga powyżej usuwam część' file:// ' łańcucha url, ponieważ menedżer plików tego nie lubi:

[lastCapturedFile substringFromIndex:7]

Inne rzeczy do rozważenia są omówione w różnych dokumentach dotyczących tego, co robisz z tym zasobem - transkodowanie, redukcja rozmiaru obrazu i wiele innych. Uważaj, że każde transkodowanie za pomocą {[4] } ulegnie awarii, jeśli UIImagePickerViewController jest wyświetlany.

 1
Author: elliotrock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 00:10:51