New Info
postanowiłem gdzie mój problem polega tworząc swizzled metodę autorelease.
Nie polecam tego, chyba że wiesz, co robisz, jednak to właśnie odkryłem.
+ (void) load; //Method is called outside the original autorelease pool.
+ (void) initialize; // Method is called outside the original autorelease pool.
NSThread tworzy własny wątek, wywoływana metoda powinna być owinięta w pulę autorelease.
Grand Central Dispatch zajmuje się adaptacją puli autorelease podczas korzystania z komend "dispatch _...". jednak, gdy wysyłasz ręcznie. możesz go zawinąć do puli autorelease.
Również ARC nie radzi informować, że autorelease będzie miało miejsce poza pulą.
Dlatego jeśli używasz ARC i wiesz, że będziesz poza pulą autorelease. I nic nie możesz na to poradzić. Będziesz chciał uniknąć wszystkich wygodnych metod.
użyj tego.
[[NSString alloc] initWithFormat:@"%@",myObject];
zamiast tego
[NSString stringWithFormat:@"%@",myObject];
pozwoli system łuku zachować i zwolnić, ale podstawowa autorelease wykonane metodą wygody zostaną pominięte, ponieważ nie będą już wykorzystywane metody ogólnospożywczy.
Nadzieję, że pomaga.
Original Odpowiedź
Ok, ja nie czujesz to pytanie odpowiedział wystarczająco szczegółowo.
komunikat prezentowany był
objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
debugger jest wskazanie ewentualnego przerwania, które pomogą Ci debugować sytuacji. Teraz, gdy ten punkt przerwania naprawdę niewiele zrobił, aby pomóc w debugowaniu sytuacji. Myślę, że ważne jest, aby wiedzieć, jak dodać ten punkt przerwania do debuggera, więc poświęciłem czas na manipulowanie nim (po przeszukiwaniu Internetu i nie znajdowaniu niczego), dopóki nie dostanę tego błędu.
To trochę denerwujące, że przerwa we wszystkich błędach nie bierze tego, ale tutaj są kroki, aby dodać punkt przerwania do debuggera.
Pierwszą rzeczą, którą chcesz zrobić, to wybrać debugger za przerwania nawigator
klikając na tej karcie
obok spojrzeć w kierunku dolnej części panelu nawigatora i naciśnij przycisk Plus
Umożliwi to ręczne dodanie punktu przerwania.
Wybrałem punkt przerwania C++ i wprowadziłem nazwę wiadomości w polu tekstowym nazwy.
po dodaniu ten wyjątek to rzeczywiście przerwie.
Jednak może to być przydatne dla ciebie jako obiektywnego programisty c. To włamało się do kodu Zgromadzenia.
Niestety to tylko pokazał to punkt na stosie wywołań dla wątku.
I okazało się, że problem autorelease dlatego klasa o nazwie autorelease w rozmowie dispatch_once. a dalsze dochodzenie ujawniło, że ładunek + (próżnia); metoda na klasie została wywołana przed wszystkim innym.odbywa się to za pomocą funkcji call_load_methods i znajduje się poza wątkiem w głównej metodzie.
skorygować to, ja tylko dodaje opakowanie puli autorelease wokół wywołania.
Innym rozwiązaniem może być dodanie pulę autorelease wewnątrz + (void) ładunku; metoda. ale to wystarczyło dla moich zastosowań.
UWAGA: Dodaję to do posta tutaj, ponieważ nie lubię znajdować problemu i nie mogę znaleźć wszystkich ścieżek do wynikowej odpowiedzi. Jeśli debugger powie ci, aby dodać punkt przerwania do wymienionej funkcji, to gdzieś powinna znaleźć się informacja, aby uzyskać te informacje. Mam nadzieję, że zmniejszy to frustrację niektórych osób próbujących znaleźć tę odpowiedź.
Czy masz pulę autorelease? i sprawdź aplikację pod kątem wycieków za pomocą jednego z programów pomocniczych, które możesz znaleźć w xcode (profil to) – chikuba
Nie używam żadnych pul autorelease. Prawdę mówiąc, nie rozumiem, dlaczego używałbyś jednego, więc nigdy tego nie zrobiłem. Ale spróbuję, że – Andrew
Pojawi się przed App del. Kończy się, Ale skomentowałem liniowo po linii całą rzecz, a ja wciąż przeciekałem przedmioty. Jakiekolwiek myśli? – Andrew