วิธีดูเนื้อหาของตัวแปร NSDictionary ใน Xcode debugger?


85

มีวิธีดูคู่คีย์ / ค่าของตัวแปร NSDictionary ผ่านดีบักเกอร์ Xcode หรือไม่ นี่คือขอบเขตของข้อมูลเมื่อขยายเต็มในหน้าต่างตัวแปร:

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

ฉันคาดหวังว่ามันจะแสดงให้ฉันเห็นแต่ละองค์ประกอบของพจนานุกรม (คล้ายกับตัวแปรอาร์เรย์)

คำตอบ:


140

ในหน้าต่าง gdb คุณสามารถใช้poเพื่อตรวจสอบวัตถุ

ให้:

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

การตั้งค่าเบรกพอยต์หลังจากเพิ่มวัตถุแล้วคุณสามารถตรวจสอบสิ่งที่อยู่ในพจนานุกรมได้

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

แน่นอนว่านี่คือNSStringวัตถุที่พิมพ์อย่างสวยงาม YMMV กับวัตถุที่ซับซ้อนอื่น ๆ


7
ไฮ! gdb คืออะไร? po คืออะไร? ไม่แน่ใจว่าจะเข้าใจ ... ขอบคุณสำหรับความช่วยเหลือ! :)
Martin

1
โอเคฉันพบว่า GDB ย่อมาจาก GNU debugger และในความเป็นจริงแล้วหน้าต่างดีบักเกอร์ของ Xcode ตอนนี้ฉันต้องการค้นหา po
Martin

18
ตกลง! ดังนั้น gdb จึงเป็นพรอมต์ในคอนโซลซึ่งคุณสามารถป้อนคำสั่งได้ เมื่อพิมพ์ "po object_name" คุณจะได้รับเนื้อหาของวัตถุที่พิมพ์ในคอนโซล
Martin

7
po เป็นนามแฝงสำหรับ print-object
Brad Cupit

วิเศษมาก! เท่ากับ "echo var_dump ()" หรือ "print_r ()" ใน PHP
mpemburn

30

คุณสามารถคลิกขวาที่ตัวแปรออบเจ็กต์ (ObjC หรือ Core Foundation) และเลือก“ พิมพ์คำอธิบายไปที่คอนโซล” (เช่นใน Run-> Variables View) สิ่งนี้จะพิมพ์ผลลัพธ์ตาม-debugDescriptionวิธีของ obejct ซึ่งโดยค่าเริ่มต้นของการเรียก-descriptionใช้ น่าเสียดายที่NSDictionaryแทนที่สิ่งนี้เพื่อสร้างข้อมูลภายในจำนวนมากโดยที่คุณมักไม่สนใจดังนั้นในกรณีนี้วิธีแก้ปัญหาของ Craigb จะดีกว่า

คีย์และค่าที่แสดงก็ใช้-descriptionเช่นกันดังนั้นหากคุณต้องการข้อมูลที่เป็นประโยชน์เกี่ยวกับวัตถุของคุณในคอลเลกชันและที่อื่น ๆ การลบล้าง-descriptionเป็นสิ่งที่จำเป็น โดยทั่วไปฉันใช้มันตามบรรทัดเหล่านี้เพื่อให้ตรงกับรูปแบบของการNSObjectใช้งานเริ่มต้น:

- (NSString *) คำอธิบาย
{
    return [NSString stringWithFormat: @ "<% @% p> {foo:% @}", [self class], self, [self foo]];
}

6

คุณสามารถใช้ CFShow ()

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

ในผลลัพธ์คุณจะเห็น

{
  bar = foo;
  buz = fiz;
}

3

XCode 4.6 ได้เพิ่มฟังก์ชันการทำงานต่อไปนี้ซึ่งอาจเป็นประโยชน์กับคุณ

The elements of NSArray and NSDictionary objects can now be inspected in the Xcode debugger

ตอนนี้คุณสามารถตรวจสอบประเภทวัตถุเหล่านี้ได้โดยไม่ต้องพิมพ์วัตถุทั้งหมดในคอนโซล สนุก!

ที่มา: http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_6.html


นี่เป็นรถสำหรับฉัน - แสดงเฉพาะส่วนหนึ่งของ NSDictionary ของฉัน
Paul Slocum


1

หากคุณต้องการพิมพ์สิ่งเหล่านี้ในการดำเนินการเบรกพอยต์ใน XCode สมัยใหม่ (ใช่ฉันอายุ 10 ปีหลังจากโพสต์ต้นฉบับ!) ให้ใช้นิพจน์เบรกพอยต์ต่อไปนี้ในการดำเนินการ "ข้อความบันทึก":

@ myDictionary.description @

ด้านล่างนี้เป็นภาพหน้าจอของการกระทำเบรกพอยต์ของฉันโดยที่เหตุการณ์ตัวแปรเป็น NSString และบริบทของตัวแปรคือ NSDictionary ที่ฉันกำลังบันทึกเนื้อหาของ :


0

นอกจากนี้คุณยังสามารถใช้NSLog

นอกจากนี้คุณสามารถไปที่ Debug area หรือ xcode จากนั้นค้นหาจากAll Variables, Registers, Globals and Staticsนั้นเลือกตัวแปรของคุณ คลิกขวาที่มัน จากนั้นเลือกPrint description of "...."

หวังว่าจะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.