2013-08-06 29 views
8

Tôi ghi đè lên đối tượng -(NSString*)description tuy nhiên Xcode luôn hiển thị error: summary string parsing error trong trường tóm tắt trong chế độ xem biến.Mô tả NSObject và tóm tắt tùy chỉnh trong Xcode

thực hiện hiện tại của tôi là như sau:

- (NSString*)description { 
    return [NSString stringWithFormat:@"<%@ %p> x=%f, y=%f", self.class, self, _x, _y]; 
} 

Nếu tôi gõ po objectName trong giao diện điều khiển, LLĐB cho thấy một kết quả tốt đẹp như mong đợi, tuy nhiên Xcode và lệnh p objectName luôn chỉ ra lỗi, vì vậy định dạng debug mô tả thích hợp để là những gì làm cho trường tóm tắt hoạt động? Đáng chú ý là đầu ra của lệnh "p" giống như một thông báo tóm tắt mà bạn thấy trong Xcode cho các thể hiện của các lớp Foundation.

Cập nhật:

Theo như tôi có thể nhìn thấy từ "WWDC 2012 phiên Debugging trong Xcode", tóm tắt tùy chỉnh có thể được thực hiện chỉ sử dụng kịch bản Tuỳ chỉnh python. Các phương thức -(NSString*)description hoặc -(NSString*)debugDescription không được kết nối với các tin nhắn tóm tắt. Tôi nghĩ rằng họ là vì tôi đã có một lỗi hiển thị, nhưng có vẻ như đó là một thông điệp tiêu chuẩn cho các lớp học mà không có trình định dạng riêng của họ.

+0

Bạn nói "ghi đè" - đây có phải là phân lớp hoặc danh mục không? Và siêu lớp là gì? –

+2

Và tôi không yêu cầu bạn nói "p objectName" trong Xcode. Trong trình gỡ rối Xcode, tôi đã luôn làm 'po' cho một đối tượng. 'p' là dành cho vô hướng. –

+0

Một điều cần lưu ý là Hot picks, là "p objectName" sẽ làm việc cho hầu hết các đối tượng Foundation chuẩn (NSStrings, NSArrays, v.v.) bởi vì lldb có các trình định dạng dựng sẵn để biết cách định dạng đối tượng mà không cần chạy mã trong chương trình của bạn. Như Andy lưu ý trong bản cập nhật của mình, bạn cũng có thể viết các trình định dạng tùy chỉnh của riêng bạn cho đối tượng của riêng bạn bằng Python - nó khá dễ dàng một khi bạn nhận được nó. –

Trả lời

2

tôi sẽ đề nghị ít nhất:

- (NSString*)description { 
    return [NSString stringWithFormat:@"%@; x=%f, y=%f", [super description], _x, _y]; 
} 

Vì vậy mà bạn không tự sao chép mặc định NSObject và do đó ngăn chặn mọi hành vi không mặc định lớp cha của bạn có thể đã chọn để bao gồm.

Ngoài ra, "lỗi phân tích chuỗi tóm tắt" là lỗi lldb. Nó chỉ được trình gỡ rối báo cáo. Mỗi its documentation, po là chính xác cho các đối tượng Mục tiêu-C; p là dành cho các đối tượng C hoặc C++. Vì vậy, bạn không cần phải chú ý đến lỗi đó - về cơ bản nó chỉ nói với bạn rằng bạn đã sử dụng lệnh lldb sai.

EDIT: cho những gì nó có giá trị, phương pháp được sử dụng bởi CFArrayopen source và trông giống như:

static CFStringRef __CFArrayCopyDescription(CFTypeRef cf) { 
    CFArrayRef array = (CFArrayRef)cf; 
    CFMutableStringRef result; 
    const CFArrayCallBacks *cb; 
    CFAllocatorRef allocator; 
    CFIndex idx, cnt; 
    cnt = __CFArrayGetCount(array); 
    allocator = CFGetAllocator(array); 
    result = CFStringCreateMutable(allocator, 0); 
    switch (__CFArrayGetType(array)) { 
    case __kCFArrayImmutable: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = immutable, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    case __kCFArrayDeque: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = mutable-small, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    } 
    cb = __CFArrayGetCallBacks(array); 
    for (idx = 0; idx < cnt; idx++) { 
    CFStringRef desc = NULL; 
    const void *val = __CFArrayGetBucketAtIndex(array, idx)->_item; 
    if (NULL != cb->copyDescription) { 
     desc = (CFStringRef)INVOKE_CALLBACK1(cb->copyDescription, val); 
    } 
    if (NULL != desc) { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : %@\n"), idx, desc); 
     CFRelease(desc); 
    } else { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : <%p>\n"), idx, val); 
    } 
    } 
    CFStringAppend(result, CFSTR(")}")); 
    return result; 
} 

Như với các ý kiến ​​khác ở trên, tôi sẵn sàng đánh bạc rằng câu trả lời là: isn debugger Xcode của không thông minh theo bất kỳ nghĩa nào và chắc chắn không đủ thông minh để sử dụng chính xác po các phương tiện để có được mô tả Mục tiêu-C; nếu đối tượng của bạn là một đối tượng Objective-C không bị ảnh hưởng thì trình gỡ lỗi sẽ không thể tìm ra nó.

+0

Cảm ơn bạn đã đề xuất. Tôi chỉ muốn có một gợi ý tốt đẹp giống như cái mà NSArray có, nó cho thấy số lượng các phần tử trong mảng. – Andy

+0

... và bạn không muốn phải gõ 'po'? Nếu có một sự khác biệt sau đó, tại một đoán, đó là 'NSArray' là cầu nối miễn phí cầu nối và do đó nó không chỉ là một Objective-C đối tượng mà còn ít nhất một loại khác của điều. – Tommy

+1

Tommy, đó là về thông điệp tóm tắt được hiển thị trong các biến Xcode xem trong khi gỡ lỗi và có thể rất hữu ích, rất hữu ích để bạn thậm chí không phải gõ bất cứ điều gì. – Andy

Các vấn đề liên quan