Tuesday, February 8, 2011

How to view contents of NSDictionary variable in Xcode debugger?

Is there a way to view the key/value pairs of a NSDictionary variable through the Xcode debugger? Here's the extent of information when it is fully expanded in the variable window:

Variable  Value      Summary
jsonDict  0x45c540   4 key/value pairs
 NSObject {...}
  isa     0xa06e0720

I was expecting it to show me each element of the dictionary (similar to an array variable).

  • In the gdb window you can use po to inspect the object.

    given:

    NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
    [dict setObject:@"foo" forKey:@"bar"];
    [dict setObject:@"fiz" forKey:@"buz"];
    

    setting a breakpoint after the objects are added you can inspect what is in the dictionary

    (gdb) po dict
    {
      bar = foo;
      buz = fiz;
    }
    

    Of course these are NSString objects that print nicely. YMMV with other complex objects.

    Martin : Hi! What is gdb? What is po? Not sure to understand... Thanks for your help! :)
    Martin : Ok so I found out that GDB stands for GNU debugger and is in fact the debugger window of Xcode. Now I need to find what is po
    Martin : OK! So gdb is in fact a prompt in the Console, where you can input commands. By typing "po object_name" you got the object content printed in the console.
    Jason Prado : this is quite late, but you are a great, great man.
    From craigb
  • You can right-click any object (ObjC or Core Foundation) variable and select “Print Description to Console” (also in Run->Variables View). This prints the result the obejct’s -debugDescription method, which by default calls -description. Unfortunately, NSDictionary overrides this to produce a bunch of internal data the you generally don’t care about, so in this specific case craigb’s solution is better.

    The displayed keys and values also use -description, so if you want useful information about your objects in collections and elsewhere, overriding -description is a must. I generally implement it along these lines, to match the format of the default NSObject implementation:

    -(NSString *) description
    {
        return [NSString stringWithFormat:@"<%@ %p>{foo: %@}", [self class], self, [self foo]];
    }
    From Ahruman

0 comments:

Post a Comment