How to dump data stored in objective-c object (NSArray or NSDictionary)

做~自己de王妃 提交于 2019-11-28 04:28:59

In Cocoa, there is no "dump" like PHP's print_r or python's repr since there is no textual format that "represents" an object as in those languages. If you use

NSLog(@"%@", myObj);

or

NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];

or

NSString *stringRep = [myObj description];

you will get (logged to console in the first case), the result of [myObj description], a method defined in NSObject for the purpose of printing a description (not a dump) of an object.

If you invoke po myObj in gdb, you get [myObj debugDescription] (often the same as description, but not always).

Classes like NSArray and NSDictionary and NSData override description to print a pretty useful recursive description of their contents, but the default [NSObject description] prints only the pointer value corresponding to the instance.

If you control the code for the types in question, you can override their description or debugDescription methods to return anything you want. If not, you could override the description or debugDescription method using a category, or use a category to define a myDebugDescription or some such that you could then invoke from gdb using po [myObj myDebugDescription].

you can also use the gdb print object command to quickly view an object in the debugger:

po dictionary

This will be basically the same as calling NSLog(...) from within your code.

Also useful when printing out NSData that contains ASCII data is:

p (char *) [data bytes]

Use NSLog() to dump contents of objects. For example:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);

NSLog has a printf-style format string (expects an NSString object) followed by a variable list of parameters, just like printf. The replacement character %@ represents an object the description method on an object. This is useful for dumping most Objective-C objects in Cocoa.

If you want to dump the contents of an object using gdb (I see you tagged this with gdb), use the special "po" directive instead of print. For example:

gdb) po myData

will cause gdb to dump the myData object. po is a shortcut for print-object.

Be careful with NSLog logging -> you most likely don't want it in production code.

You may want to use an alternate logging function that calls NSLog when your product is running in debug mode.

TCB13

I usualy go with this to "debug" NSArray contents:

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}

The code will enumerate all objects in the NSArray myarray, and then iterate through and print every object.

Hope this can be useful for someone!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!