2013-08-06 2 views
8

Я переопределяю объект -(NSString*)description, однако Xcode всегда отображает error: summary string parsing error в поле summary в виде переменных.Описание NSObject и пользовательские сводки в Xcode

Моя текущая реализация является следующее:

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

Если я ввожу в консоли po objectName, LLDB показывает прекрасный выход, как и ожидалось, однако Xcode и команда p objectName всегда указывает на ошибку, так что правильный формат описания отладочную сделать резюме поле работы? Стоит заметить, что вывод команды «p» совпадает с итоговым сообщением, которое вы видите в Xcode для экземпляров классов Foundation.

Update:

Насколько я могу видеть из «WWDC 2012 сеанса отладки в Xcode», пользовательские резюме могут быть реализованы с использованием только на заказ питон скрипт. -(NSString*)description или -(NSString*)debugDescription методы никак не связаны с итоговыми сообщениями. Я думал, что это потому, что я получил сообщение об ошибке, но, похоже, это стандартное сообщение для классов, у которых нет собственных форматировщиков.

+0

Вы говорите «переопределить» - это подкласс или категория? А что такое суперкласс? –

+2

И я не понимаю, что вы делаете «p objectName» в Xcode. В отладчике Xcode я всегда делал 'po' для объекта. 'p' для скаляров. –

+0

Одна вещь, которую следует отметить, Hot Licks, заключается в том, что «p objectName» будет работать для большинства стандартных объектов Foundation (ваши NSStrings, ваши NSArrays и т. Д.), Потому что lldb имеет встроенные форматы, которые умеют форматировать объект, не запуская никаких кода в вашей программе. Как отмечает Энди в своем обновлении, вы также можете написать свои собственные форматы для своего собственного объекта в Python - это довольно легко, как только вы его повесите. –

ответ

2

Я хотел бы предложить, по крайней мере:

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

Так что вы не вручную тиражирование NSObject по умолчанию и тем самым блокируя любую нестандартную поведение ваш суперкласса может быть выбор в пользу включения.

Помимо этого, «сводная ошибка синтаксической строки» является ошибкой lldb. Сообщается только отладчику. Per its documentation, po подходит для объектов Objective-C; p предназначен для объектов C или C++. Поэтому вам не нужно прислушиваться к этой ошибке - это просто говорит вам, что вы использовали неправильную команду lldb.

EDIT: для чего это стоит, метод, используемый CFArray является open source и выглядит следующим образом:

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; 
} 

Как и с другими комментариями выше, я готов играть в азартные игры, что ответ: отладчик ISN Xcode в «умный в каком-то смысле и определенно недостаточно умен, чтобы использовать правильные способы получения описания Objective-C; если ваш объект является неотъемлемым объектом Objective-C, тогда отладчик не сможет понять его.

+0

Спасибо за предложение. Я просто хотел иметь приятный намек, подобный тому, который имеет NSArray, и показывает количество элементов в массиве. – Andy

+0

... и вы не хотите вводить 'po'? Если есть разница, то, по предположению, это 'NSArray' является бесплатным мостом, и поэтому это не только объект Objective-C, но и, по крайней мере, еще один вид вещей. – Tommy

+1

Tommy, это о сводном сообщении, которое отображается в представлении переменных Xcode во время отладки и которое может быть очень полезно, поэтому полезно, поэтому вам даже не нужно вводить что-либо. – Andy

 Смежные вопросы

  • Нет связанных вопросов^_^