Breakpoint wskazujący " objc autoreleaseNoPool"
Więc debuguję aplikację w preperacji dla jej aplikacji, więc zwolnij, i włączyłem uniwersalny punkt przerwania dla "wszystkich wyjątków". Od tego czasu, za każdym razem, gdy uruchamiam aplikację, konsola drukuje:
Catchpoint 2 (throw)oczekujący na breakpoint 1 - "objc_exception_throw" rozwiązany
Objc[11765]: obiekt 0x8f18ff0 klasy _ _ nscflocale autoreleased bez puli w miejscu-just leaking-break na objc_autoreleaseNoPool () do debugowania
Objc [11765]: Object 0x8f190a0 of class __NSCFNumber autoreleased with no pool in place-just leaking-break on objc_autoreleaseNoPool () to debug
Objc[11765]: obiekt 0x8f1fef0 klasy _ _ nscflocale autoreleased bez puli w miejscu-just leaking-break na objc_autoreleaseNoPool () do debugowania
Dosłownie Wydrukowano 3 razy. Nie mam pojęcia, co to znaczy, ale wygląda źle. Każda rada będzie mile widziana.
3 answers
New Info
Określiłem, gdzie leży mój problem, tworząc swizzled autorelease method.
Nie zalecam robienia tego, chyba że wiesz, co robisz, jednak to jest to, co dowiedziałem się.
+ (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łana metoda powinna być owinięta w pulę autorelease.
Grand Central Dispatch dba o adaptację przez pulę autorelease podczas korzystania z "dispatch_..."komendy. jednak, gdy wysyłasz ręcznie. ty może chcesz owinąć go w pulę autorelease.
Ponadto ARC nie radzi sobie z informowaniem Cię, że autoelease wydarzy się poza basenem.
Dlatego jeśli używasz ARC i wiesz, że będziesz poza pulą autorelease. I nic na to nie poradzisz. Będziesz chciał uniknąć wszystkich metod wygody.
Użyj tego.[[NSString alloc] initWithFormat:@"%@",myObject];
Zamiast tego
[NSString stringWithFormat:@"%@",myObject];
To pozwoli systemowi arc zachować i zwolnić, ale podstawowy autorelease zrobione metoda wygody zostanie pominięta, ponieważ nie użyjesz metody wygody.
Mam nadzieję, że to pomoże.Oryginalna ODPOWIEDŹ
OK, nie wydaje mi się, aby na to pytanie odpowiedziano wystarczająco szczegółowo.
Prezentowana wiadomość była
objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Debuger wskazuje możliwy punkt przerwania, który pomoże Ci debugować sytuację. Teraz, gdy ten punkt przerwania naprawdę niewiele zrobił, aby pomóc w debugowaniu sytuacji. Myślę, że ważne jest, aby wiedzieć, jak aby dodać ten punkt przerwania do debuggera, a więc spędziłem czas majstrując przy nim (po przeszukaniu Internetu i znalezieniu niczego), dopóki nie dostałem go do złamania na tym błędzie.
To trochę denerwujące, że złamanie wszystkich błędów nie łapie tego, ale oto kroki, aby dodać punkt przerwania do debuggera.
Pierwszą rzeczą, którą chcesz zrobić, to wybrać Nawigator punktu przerwania debuggera
Klikając na tę kartę
Następnie patrzysz w stronę na dole panelu nawigatora i naciśnij przycisk Plus
To pozwoli Ci ręcznie dodać punkt przerwania.
Wybrałem punkt przerwania C++ i wpisałem nazwę wiadomości w polu tekstowym Nazwa.
Po dodaniu tego wyjątku faktycznie się zepsuł.
Jednak może to być przydatne lub nie dla programisty objective C. To włamało się do Kodeksu Zgromadzenia.
Niestety pokazało to tylko wskaż na stosie połączeń dla wątku.
I okazało się, że problem z autorelease był spowodowany przez klasę nazwaną autorelease w wywołaniu dispatch_once. dalsze badania wykazały, że metoda + (void)load; na klasie została wywołana przed czymkolwiek innym. odbywa się to za pomocą funkcji call_load_methods i znajduje się poza wątkiem w głównej metodzie.
Aby to poprawić, dodałem tylko owijkę pool autorelease wokół sprawdzam.
Innym rozwiązaniem może być dodanie puli autorelease wewnątrz metody + (void)load;. ale to wystarczyło do moich zastosowań.
Uwaga: dodaję to do postu tutaj, ponieważ nie lubię znaleźć problemu i nie jestem w stanie dowiedzieć się wszystkich ścieżek do wynikowej odpowiedzi. Jeśli debugger każe Ci dodać punkt przerwania do wymienionej funkcji, to powinno być gdzieś jakieś informacje, aby je uzyskać. Mam nadzieję, że obniży to frustracja niektórych z tych, którzy próbują znaleźć tę odpowiedź.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-22 21:14:18
Wiele metod w API cocoa zwraca obiekty z autorelementem. W szczególności te metody, które zwracają obiekt, który nie zaczyna się od init
, takie jak [NSNumber numberWithLong:]
. Jeśli nie masz puli autorelease na miejscu, obiekty te zostaną wyciekły. Więcej informacji na temat używania NSAutoreleasePool
można znaleźć w dokumentacji .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 02:04:57
Oznacza to, że musisz utworzyć pulę autorelease w wątku, który się dzieje. W przeciwnym razie przydzielone obiekty nie zostaną zniszczone(zgodnie z sugestią zawartą w wiadomości). Przerwa/pauza na symbol, a następnie przejdź do stosu do wpisu wątku (lub programu) i dodaj pulę autorelease. To wszystko.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 02:20:45