2011-11-23 13 views
12

Mam następujący fragment kodu, którego używam do skalowania obrazów. To jest w pętli, która tworzy i drenuje pulę autorelease dla każdego przejścia. Ten kod działa dobrze w symulatorze w iOS5.0, w iOS4.3 na iPadzie lub symulatorze, ale na iOS5.0.1 na iPadzie1, po 50-60 przejściach, drawInRect zaczyna zużywać pamięć, która nigdy nie zostanie zwolniona. Dzwoniłem do tego z dodatkowego wątku, ale teraz przywołuję operacje skalowania głównego wątku.Wykrywanie wycieków pamięci Wyjątek na iOS5.0.1

UIGraphicsBeginImageContext(newSize); 
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Czy robię coś nie tak, czy to jest błąd iOS5.0.1?

Aktualizacja: Próbowałem wielu testów. Udało mi się dowieść, że ten sam kod skompilowany z XCode 4.0 działa dobrze na tym samym iPadzie. Ten sam kod skompilowany z XCode 4.2.1 powoduje brak pamięci. Ta procedura skalowania jest wywoływana w wątku tła. Napisałem inną procedurę skalowania przy użyciu niższych poziomów podstawowych wywołań graficznych. Nie przecieka z XCode 4.0, ale przecieka w mojej aplikacji z XCode 4.2.1. Dokładnie to samo drzewo wywoływania i wywoływania w samodzielnym projekcie nie wydaje się przeciekać (dużo) pamięci na XCode 4.2.1. Czekam na wiadomość od Apple na ten temat. W międzyczasie potrzebuję używać XCode 4. Jedyny obraz instalacyjny, który mam, wymaga Snow Leopard, co oznacza, że ​​używam mojej starszej maszyny z lat 5-tymi. Dzięki

Aktualizacja 1/2012 Wydaje się, że to zdarza się tylko wtedy, gdy aplikacja jest uruchomiona z poziomu XCode. Ten sam program uruchamiany na iPadzie nie wykazuje przecieku. Inna aplikacja o tej samej rutynie nie wykazuje przecieku.

Otworzyłem zgłoszenie błędu w firmie Apple i przesłałem im projekt, który powiela problem. Nie oczekuję, że zostanie to rozwiązane w najbliższym czasie, ale nie wydaje się tak wszechobecne, jak początkowo sądziłem.

Aktualizacja 6/2012 Aktualizacja 6/2012 Pomimo wysłania Apple minimalnego projektu, który powtarza problem, twierdzą oni, że nie są w stanie odtworzyć problemu i nie robią żadnych postępów.

+0

Podobno zadaję trudne pytania z kilkoma odpowiedziami, które naprawdę rozwiązują problem. Takich jak ten. Naprawdę może to być kompilacja błędów w bibliotekach w XCode 4.2. Ten sam kod skompilowany z SDK dla iOS 4.2 nie wykazywał wycieku pamięci na iPadzie z systemem iOS5.0.1. – David

+0

Czy znalazłeś rozwiązanie tego problemu? – vondip

+1

Wystąpił wyciek tylko wtedy, gdy aplikacja została uruchomiona przez XCode. Po uruchomieniu normalnie na iPadzie, nie wyciekło. Użytkownicy zgłosili awarię, która brzmiała tak, jak to spowodowało, ale myślę, że nie mieli ze sobą związku. Zmarnowałem miesiąc paniki, próbując rozwiązać. Otworzyłem raport o błędzie, ale nigdy nie otrzymałem użytecznej odpowiedzi. Twierdzili, że nie są w stanie się rozmnażać, ale albo nie próbowali, albo nie rozumieli. Wysłałem banalny projekt, który wyraźnie zilustrował problem. – David

Odpowiedz

4

Wierzę, że WRESZCIE znalazłem przyczynę wycieku pamięci. Podczas wykonywania niektórych wkładów danych podstawowych odkryłem podobne zachowanie. Zapętlanie, tworzenie wielu obiektów, które są wypuszczane. Po uruchomieniu na iPadzie użycie pamięci rośnie, chociaż nie ma wycieku, dopóki aplikacja nie wyładuje się z pamięci. Ale po uruchomieniu z urządzenia działa bez problemu.

Przyszło mi do głowy, że jest to coś z tego, jak został uruchomiony z Xcode. Musi to być ustawienie debugowania w projekcie.

Okazało się, że problem został spowodowany przez posiadanie NSZombieEnabled podczas debugowania. Aby wyłączyć to ustawienie w Xcode 4, kliknij prawym przyciskiem myszy schematy, np. App> targetDevice, edytuj schemat, wybierz akcję Debugowanie, zakładkę argumentów. Aby włączyć NSZombieEnabled, tworzona jest zmienna środowiskowa o tej nazwie z wartością YES i włączona jest zmienna.Aby go wyłączyć, odznacz pole wyboru.

NSZombieEnabled służy do określenia, czy próbujesz zwolnić obiekt, który został już zwolniony. W tym celu środowisko śledzi wszystkie wydane obiekty. To zużywa pamięć, która pojawia się jako wyciek pamięci.

Po wyłączeniu tego moja aplikacja, która kiedyś szybko wzrosła ponad 115 MB, zanim została zabita na iPadzie1, teraz szczęśliwie siedzi na 24 MB bez wycieku pamięci.

+0

Hmm ... Mam taki sam kod jak ty i otrzymuję OGROMNE ilości wycieków pamięci (które powodują awarię aplikacji), ale zombie były już dla mnie niedostępne. .. Masz jednak rację, kiedy ręcznie uruchamiam aplikację, nie ma problemu ... ale jeśli uruchomię ją z Xcode ... CRASH CRASH CRASH! :( –

+0

Ten sam problem przydarzył się również mnie, używam xCode 5, NSZombieEnabled jest odznaczony. – codingrhythm

2

Kod, który wysłałeś, nie powinien powodować przecieków. Przeciek jest zdecydowanie gdzie indziej.

Polecam następujące dwa etapy:

  1. Posta kodu używasz do zarządzania pulę autorelease.
  2. Upewnij się, że wykonujesz te linie kodów w głównym wątku (Apple's documentation oznacza, że ​​jest to rzeczywiście ważne).
+0

Nie jest to bezpieczne dla wątków – hooleyhoop

Powiązane problemy