Brudna pamięć ImageIO nie jest automatycznie czyszczona przez iOS

Tworzę aplikację, która jest rodzajem galerii-pokazuje różne treści multimedialne jako przeglądarka pełnoekranowa. Instrument alokacji pokazuje, że parametr Live Bytes nie rośnie więcej niż 40 Mb podczas korzystania z aplikacji. Tymczasem aplikacja jest 100% jest zabity po i slajdów stron 20-30 razy. Sprawdziłem parametr Dirty Memory i okazało się, że był 10 razy większy niż rozmiar żywych bajtów. I większość tej brudnej pamięci pochłonęła Obraz IO:

Zrzut ekranu http://i40.tinypic.com/25ge51i.jpg

Edycja, kolejny zrzut ekranu:

Zrzut ekranu http://i40.tinypic.com/9t1mh5.png

Powyższe szczyty alokacji zmieniają zawartość multimediów wideo/obrazu. Problem w tym, że brudna pamięć rośnie niemal liniowo i muszę ją jakoś uwolnić.

Teraz o projektowaniu aplikacji. Ekran aplikacji ma jeden poziomy widok przewijania. Widok przewijania zawiera filmy wideo lub obiekty kolażu, które zawierają wiele obrazów. Aby zapisać pamięć tylko trzy strony są tworzone w czasie-bieżąca strona i strony po lewej / prawej stronie. Tak więc strony zawsze tworzone i usuwane w locie podczas przesuwania widoku przewijania.

Wszystkie obrazy Ładuję metodą [UIImage imageWithContentOfFile: path]. Obiekt Collage przechowuje instancje UIImage wewnątrz imagesArray. W metodzie dealloc atrybut imagesArray jest wyczyszczony.

Więc, pytania:

  • jest to rodzaj błędu systemowego w [UIImage imageWithContentOfFile?]
  • czy to Image IO cache?
  • mogę to wyczyścić?
Author: byJeevan, 2013-05-06

2 answers

Umieszczenie tego tutaj jako zbyt dużego na komentarz, tylko kilka pomysłów:

1) jednym ze sposobów na zachowanie obiektów przez pomyłkę jest posiadanie obiektów w widokach, które są ukryte, ale nie usuwane z ich superview (i tym samym pozostają zachowane)

2) jeśli zrobisz coś z UIImageView itp na dowolnym wątku nie głównym wątku złe rzeczy mogą się zdarzyć (jak to)

3) Skopiuj swój projekt, abyś mógł swobodnie z nim zadzierać i wypróbować kilka rzeczy:

  • Zamiast wielu obrazów, zawsze załaduj ten sam obraz, ale pozostaw Inne części kodu takie, jakie są - czy coś się zmienia?

  • W podklasach, które tworzysz, które przechowują/zachowują obrazy, umieść wiadomość dziennika w dealloc, aby sprawdzić, czy w rzeczywistości te obiekty są deallocowane.

  • Podklasa UIImageView, użyj jej dla obrazów i zaloguj dealloc

  • Podklasa UIImage, użyj go dla tych obrazów, Zaloguj dealloc

4) trudno mi uwierzyć w obraz ma wadę, która by to zrobiła, ale to, co możesz zrobić, to przełączyć się na użycie imageWithData i załadować dane samodzielnie. Użyj flagi F_NOCACHE, gdy faktycznie odczytujesz dane - jest inny kod, więc jak to zrobić, możesz szukać na nim(odpowiedziałem na pytanie).

Jeśli możesz stworzyć projekt demo z tą wadą, byłoby o wiele łatwiej go debugować, niż tylko zgadywać, co robić. Rejestrowanie klasy, która dostaje dealloc ' d idzie długą drogę, ponieważ od razu zobaczysz, co nie jest uwolnienie, a potem lepiej skupić się na problemie.

 19
Author: David H,
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
2013-05-07 13:43:49

Oprócz odpowiedzi Davida H polecam każdemu, kto doświadcza tego problemu, aby również sprawdzić, czy Kontrolery widoku, modele, UIDocument (jeśli go używasz) deinitializery są wywoływane, gdy nie są potrzebne.

Jeśli nie masz poprawnie dealokacji tych klas i zawierają one dane image / VDO / content, do których odnosi się UIKit, może to spowodować taki scenariusz, w którym zużycie pamięci VM: ImageIO stale rośnie, a mimo to nie widać wycieku pamięci podczas używania Instrumenty, ponieważ te treści są teraz przechowywane wewnętrznie przez UIKit.

Ja też doświadczyłem tego problemu, dwa razy, a w moim przypadku okazało się, że deinitializer mojego modelu nigdy nie został wywołany z powodu niepowiązanych problemów. Naprawiając te niepowiązane problemy i upewniając się, że mój Model jest dealokowany, Te VM: ImageIO ciągły wzrost zniknął.

Tutaj wpisz opis obrazka

 0
Author: HuaTham,
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
2018-01-14 10:19:17