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.

Author: Andrew, 2012-04-04

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

pasek narzędzi nawigatora

Klikając na tę kartę

przycisk punktu przerwania

Następnie patrzysz w stronę na dole panelu nawigatora i naciśnij przycisk Plus

Dodaj Punkt Przerwania Wyjątku

To pozwoli Ci ręcznie dodać punkt przerwania.

Wybrałem punkt przerwania C++ i wpisałem nazwę wiadomości w polu tekstowym Nazwa.

Dodawanie niestandardowego wyjątku C++

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.

kod montażu w osiągniętym punkcie przerwania.

Niestety pokazało to tylko wskaż na stosie połączeń dla wątku.

Lista wątków

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.

Błąd wywołania i stosu

Aby to poprawić, dodałem tylko owijkę pool autorelease wokół sprawdzam.

zaktualizowane wywołanie błędu

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ź.

 35
Author: The Lazy Coder,
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 .

 1
Author: highlycaffeinated,
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.

 1
Author: justin,
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