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.

Author: Mariusz Jamro, 2008-11-14

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

 71
Author: Barry Wark,
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]
 16
Author: Ben Gottlieb,
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.

 10
Author: Jason Coco,
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.

 4
Author: diciu,
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ś!

 3
Author: TCB13,
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