2011-11-07 11 views
5

Próbuję dostosować się do wytycznych Apple dotyczących reagowania na ostrzeżenia o małej ilości pamięci w mojej aplikacji. Wytyczne mówią: "Po otrzymaniu (ostrzeżenie o małej ilości pamięci), aplikacja musi zwolnić jak najwięcej pamięci poprzez zwolnienie obiektów, których nie potrzebuje, lub wyczyszczenie pamięci podręcznych, które może odtworzyć później."iOS 5 + ARC - przypisuje zero do wskaźnika zwolnienia pamięci?

Pytanie brzmi: jak zwolnić pamięć za pomocą ARC?

Załóżmy na przykład, że mam obraz w hierarchii widoku, którego nie ma na ekranie. W didReceiveMemoryWarning, obecnie usuwam go z widoku, wywołując removeFromSuperview, ale nadal mam wskaźnik do samego UIImage. Czy powinienem również spróbować zwolnić tę pamięć? W jaki sposób? Przypisując zero do wskaźnika?

TIA: John

+0

Proszę podać więcej informacji na temat wskaźnika. Czy to jest ivar, lokalny w metodzie, globalna, własność? – zaph

+0

Te, o których myślę, to zmienne instancji UIImage *. – John

+0

Okay, myślę, że rozwiązałem mój problem 1) używając słabego odniesienia do podglądu i 2) przypisując zero do wskaźnika, jeśli widok był nadal w pobliżu po wykonaniu didReceiveMemeoryWarning (co było za każdym razem, gdy zobaczyłem to w debugerze) . Przede wszystkim, wydaje mi się, że właśnie zdałem sobie sprawę, że nie można uniknąć ostrzeżeń o pamięci przez cały czas ... czasami są one spowodowane przez inne aplikacje. Musisz tylko odpowiednio je obsłużyć. Po naprawieniu programu obsługi ostrzeżenia o pamięci, otrzymałem ostrzeżenie tylko raz, zamiast za każdym razem, gdy uruchomiłem UIImagePickerController. Duża poprawa. – John

Odpowiedz

3
  1. Do czasu uzyskania -didReceiveMemoryWarning, Pana zdaniem, powinna zostać wydana automatycznie przez system i -viewDidUnload powinien być nazywany. Więc jeśli nie posiadasz odnośników do subskrybentów widoku, nie ponosisz odpowiedzialności za ich uwolnienie.

  2. W przeciwnym razie, jeśli przechowujesz odniesienia do niektórych zasobów, które chcesz zwolnić, po prostu anuluj swoje referencje, przypisując im "zer" dla NSObject s, i wywołaj odpowiednie funkcje zwolnienia dla innych typów referencji, np. CFRelease dla obiektów Core Foundation.

+0

H'mmm ... Chodzi o to, że mam odniesienia do niektórych subviews, ponieważ aplikacja musi móc modyfikować lub usuwać subviews w ramach normalnej pracy aplikacji. Łatwo jest powiedzieć "self.mySubView removeFromSuperview", gdy trzeba, zamiast przechodzić przez drzewo widoku podrzędnego za każdym razem, gdy trzeba usunąć/zmodyfikować podgląd. Ale sądzę, że oznacza to, że system nie może zwolnić podglądu, nawet jeśli widok jest zwolniony. Czy subview zostanie poprawnie zwolniony, jeśli mam słabe połączenie z nim? – John

+1

Oczywiście, możesz użyć '__weak', lub możesz po prostu ustawić go na' nil' w '-viewDidUnload'. – an0

+0

W iOS6 viewDidUnload nie jest już wywoływany automatycznie. Musisz użyć didReceiveMemoryWarning. – bkbeachlabs

0

Wprowadź wszystkie właściwości IBOutlet za pomocą atrybutu strong.

Ustaw wszystkie właściwości IBOutlet wszystkie na nil w viewDidUnload.

+2

@John specjalnie zapytał o ARC. Zachowaj i zwolnij nie są już używane. – Undeadlegion

Powiązane problemy