/ / Używasz przyrządów do sprawdzania wycieków pamięci w XCode? - iPhone, Object-C, pamięć, wycieki pamięci, instrumenty

Używanie instrumentów do sprawdzania wycieków pamięci w XCode? - iphone, cel-c, pamięć, wycieki pamięci, instrumenty

Dobry dzień,

Jestem całkowicie niedoświadczony w sprawdzaniu wycieków pamięci, więc każda pomoc w tym zakresie byłaby świetna.

Właśnie skończyłem większość pracy dla siebieAplikacja na iPhone'a i teraz próbuję dowiedzieć się, dlaczego przestaje działać po kilku uruchomieniach. Używając instrumentów w trybie przecieków i przydziałów, widzę, że są dwa obiekty, które gromadzą pamięć dość szybko i nie zwalniają: wprowadź opis obrazu tutaj

Nie jestem w stu procentach pewien, gdzie i dlaczego tak się dzieje, ale kiedy kliknąłem strzałkę po prawej stronie UIDeviceRGBColor, odpowiedzialny dzwoniący jest określony jako

[UIColor allocWithZone];

Przeprowadziłem wyszukiwanie w moim projekcie dla UIColor i znalazłem to (zwróć uwagę na _colorThreshold):

wprowadź opis obrazu tutaj

Wydaje mi się, że mój problem dotyczy _colorThreshold, który nie wydaje się być uwalniany:

wprowadź opis obrazu tutaj

Próbowałem dodać automatyczne uwalnianie do argumentów inicjujących, ale spowodowało to awarię aplikacji. Czy masz tutaj jakieś porady?


EDYTUJ 1

Oto zrzut ekranu z LevelMeter.h wprowadź opis obrazu tutaj

Odpowiedzi:

2 dla odpowiedzi № 1

Istnieje kilka problemów z powyższymi:

  • Czy LevelMeterColorThreshold jest klasą Objective-C?
  • Jeśli tak, to dlaczego używasz malloc zamiast zwykłego przydzielania / inicjowania?
  • Podczas wklejania zrzutów ekranu wyników wyszukiwania nie widzimy otaczającego kodu, ponieważ wyświetlane są tylko wiersze z trafieniami wyszukiwania.

Czy przyrząd do wycieków zgłasza wycieki, czy po prostu przydzielasz niepotrzebną pamięć?
Istnieje różnica między tymi dwoma przypadkami:

  1. Wyciek ma miejsce, jeśli utracisz odniesienie do obiektu, aby nie można go było wysłać release wiadomość później.
  2. Tworzenie instancji obiektów, które nie są już potrzebne bez ich zwalniania / zwalniania

Wycieki mogą wykryć tylko pierwszy przypadek.
Próbka pod kątem wycieku:

NSMutableString* test = [[NSMutableString alloc] initWithString:@"1"];
NSLog(@"%@", test);
NSMutableString* anotherTest = [[NSMutableString alloc] initWithString:@"2"];
test = anotherTest; //here we loose reference to the original object
NSLog(@"%@", test);

Przypisując inny test do testu, utraciliśmy odniesienie wskazujące na adres pamięci zawierający @ „1”.