Jak zrzut danych przechowywanych w obiekcie objective-c (NSArray lub NSDictionary)
Przepraszam za potencjalnie głupie pytanie, ale w innych językach programowania (skryptowych, takich jak PHP lub Perl) często łatwo jest zrzucić wszystko zawarte w zmiennej.
Na przykład w PHP znajdują się funkcje var_dump()
LUB print_r()
. Perl posiada klasę Data::Dumper
CPAN, itd itd.
Czy jest coś takiego dla Objective-C? Byłoby bardzo wygodne w kilku przypadkach, aby móc zrzucić wszystko w ten sposób, zamiast używać gdb do sprawdzania każdej zmiennej.
5 answers
W Cocoa nie ma "zrzutu", jak w PHP print_r lub w Pythonie repr, ponieważ nie ma formatu tekstowego, który "reprezentuje" obiekt, jak w tych językach. Stosowanie
NSLog(@"%@", myObj);
Lub
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];
Lub
NSString *stringRep = [myObj description];
Otrzymasz (zalogowany do konsoli w pierwszym przypadku) wynik [myObj description]
, metodę zdefiniowaną w NSObject
w celu wydrukowania opisu (Nie zrzut) obiektu.
Jeśli wywołasz po myObj
w gdb, otrzymasz [myObj debugDescription]
(często to samo co description
, ale nie zawsze).
Klasy takie jak NSArray
i NSDictionary
i NSData
zastępują description
, aby wydrukować całkiem przydatny rekurencyjny opis ich zawartości, ale domyślna [NSObject description]
wyświetla tylko wartość wskaźnika odpowiadającą instancji.
Jeśli kontrolujesz kod dla danych typów, możesz nadpisać ich metody description
lub debugDescription
, aby zwrócić cokolwiek chcesz. Jeśli nie, możesz nadpisać metodę description
lub debugDescription
za pomocą kategorii lub użyć kategorii do zdefiniuj myDebugDescription
lub takie, które możesz wywołać z gdb używając po [myObj myDebugDescription]
.
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
2010-06-11 22:52:13
Możesz również użyć polecenia gdb Print object, aby szybko wyświetlić obiekt w debuggerze:
po dictionary
Będzie to w zasadzie to samo co wywołanie nslog(...) z twojego kodu.
Przydatne również podczas drukowania NSData zawierającego dane ASCII jest:
p (char *) [data bytes]
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
2008-11-14 05:08:34
Użyj NSLog () do zrzutu zawartości obiektów. Na przykład:
NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);
NSLog ma łańcuch w formacie printf (oczekuje obiektu NSString), po którym następuje zmienna Lista parametrów, podobnie jak printf. Znak zastępczy %@ przedstawia obiekt metoda opisu obiektu. Jest to przydatne do wyrzucania większości obiektów Objective-C w Cocoa.
Jeśli chcesz zrzucić zawartość obiektu za pomocą gdb( widzę, że oznaczyłeś to gdb), użyj specjalnej dyrektywy " po " zamiast druku. Na przykład:
gdb) po myData
Spowoduje, że gdb zrzuci obiekt myData. po jest skrótem dla print-object.
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
2008-11-14 04:41:39
Uważaj z logowaniem NSLog - > najprawdopodobniej nie chcesz tego w kodzie produkcyjnym.
Możesz użyć alternatywnej funkcji logowania, która wywołuje NSLog, gdy produkt jest uruchomiony w trybie debugowania.
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
2008-11-14 07:14:26
Zwykle przechodzę z tym do" debugowania " zawartości NSArray:
NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;
while ( cobj = [arrenum nextObject] ) {
NSLog(@"%@", cobj);
}
Kod wyliczy wszystkie obiekty w NSArray myarray
, a następnie iteruje i wypisuje każdy obiekt.
Mam nadzieję, że to może być przydatne dla kogoś!
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-02 19:41:13