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ą:
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):
Wydaje mi się, że mój problem dotyczy _colorThreshold, który nie wydaje się być uwalniany:
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
Odpowiedzi:
2 dla odpowiedzi № 1Istnieje 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:
- Wyciek ma miejsce, jeśli utracisz odniesienie do obiektu, aby nie można go było wysłać
release
wiadomość później. - 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”.