2012-03-18 9 views
18

W mojej aplikacji mam widok przewijania i cztery widoki tabel. Za każdym razem, gdy jeden jest przeciągany, a następnie zwalniany, otrzymuję wyciek z 48 bajtów. To naprawdę się sumuje. Jak widać, obie grupy wycieków mają to samo źródło. Czy ktoś wcześniej widział wyciek?Przeciek pamięci za każdym razem, gdy wydano UIScrollView.




Edit 1:

Po kliknięciu na strzałkę obok przecieku, uzyskać tę informację o wycieku:

Odpowiedz

28

To, co widzisz, jest znanym błędem w systemie iOS 5.1 i jest omawiane na forach programistów systemu iOS. Możesz znaleźć odpowiedni wątek, wyszukując na forach "strdup". Zobacz wątek "Wyciek pamięci elementów aplikacji". Wyszukaj wpis od pracownika Apple.

+0

Ah, rozumiem. Wygląda na to, że nic nie da się z tym zrobić. Dzięki za odpowiedzi! –

+0

Jasne, o to chodzi w tym Stack ... uzyskiwanie odpowiedzi! –

0

Najprawdopodobniej to twoja wina.

W przydziale Przydział, naciśnij przycisk "i" i włącz "Liczbę rekordów referencyjnych". Następnie Instruments może pokazać wszystkie alokacje, zatrzymać, autoreasować i zwolnić zdarzenia, które wystąpiły w tych obiektach. (Powinieneś zobaczyć strzałkę obok każdego wyciekanego przedmiotu - kliknij, aby wyświetlić historię alokacji tego obiektu.)

Myślę, że przekonasz się, że niektóre z Twoich kodów coś zatrzymują lub pośrednio powodują ich zatrzymany. Prawdopodobnie widok przewijania lub jeden z jego rozpoznawaczy gestów, jak się domyślasz.

+0

Record referencyjny liczy się włączyć, ale jak widzę wyciekły obiektów od wewnątrz Przeznaczeń? Widzę przeciekające obiekty w wyciekach (duh), ale nie widzę, gdzie zostały zatrzymane/zwolnione/autoreleased. –

+0

Właśnie próbowałem tego używając Xcode 4.3.1, używając presetu "Wycieki" w Instrumentach. Liczby rekordów zostały już włączone. Na liście wycieków obiektów w kolumnie "Adres" znajduje się ikona strzałki - kliknij, aby wyświetlić historię tego adresu. Jeśli strzałka nie jest wyświetlana, najlepiej mogę zasugerować, aby zagrać z ustawieniami w Instrumentach. –

+0

Znaleziono, ale informacje tam nie są zbyt pomocne. Edytowanie w moich wynikach. –

0

Obejście:

zdałem sobie sprawę, że jakoś to wyciekły bajty są przechowywane w Scrollview. Musisz zwolnić swój widok przewijania i przydzielić go ponownie od czasu do czasu, zachowując jego stan. Sposób wykrywania przeładowania przewijania zależy od potrzeb aplikacji. Za każdym razem, gdy zwolnisz przewijanie, te bajty również zostaną zwolnione.

+0

Nie, mam widoki przewijania i widoki tabel, które są przydzielane i dealloc'd od czasu do czasu, a to nie naprawia przecieku. Rozwiązaniem jest po prostu czekać na oficjalną poprawkę w ios. –

0

Obejście: Zauważyłem, że wystąpił wyciek pamięci w handlePan: jeśli ustawiono delegata UIScrollView. Potrzebowałem metod delegatów, więc podklasowałem UIScrollView i zadeklarowałem własny @protocol. Potem overrode selektor docelową Scrollview panGestureRecognizer, bez konieczności wysyłania go do Super:

//yourScrollView.h 
@protocol yourScrollViewDelegate 
-(void)yourProtocol; 
@end 

//yourScrollView.m 
-(void)handlePan:(id)sender{ 
    [yourDelegate yourProtocol]; 
}