iPhone - Как я могу получить глубокий вывод пользовательского класса NSLog с отступом, как это делает для NSArrays или NSDictionaries? - PullRequest
0 голосов
/ 29 февраля 2012

Я перегружаю каждый подкласс моего основного класса методом description, но внутри него, как я могу сделать так, чтобы атрибуты сохраняли отступ при необходимости?использование \ r не помогает, так как новый элемент не имеет отступа.

- (NSString*) description
{
    NSMutableString* str = [NSMutableString string];

    [str appendFormat:@"One attribute : %d\r", self.oneAttribute];
    [str appendFormat:@"List : %@\r", self.myArrayOfCustomObjects];

    return str;
}

- (NSString*) description (on custom object)
{
    NSMutableString* str = [NSMutableString string];

    [str appendFormat:@"One attribute : %d\r", self.oneAttribute];
    [str appendFormat:@"One other attribute : %d\r", self.oneOtherAttribute];

    return str;
}

1 Ответ

2 голосов
/ 29 февраля 2012

Edit:

Как указано в комментариях, вы должны включить строку #include <objc/runtime.h> в исходный файл, чтобы использовать этот фрагмент.


Вы можете использовать этот код (я не помню, где я его нашел), чтобы распечатать все свойства объекта с хорошим форматированием:

- (NSString*)description {
    NSMutableString* string = [NSMutableString stringWithString:@""];
    unsigned int propertyCount;
    objc_property_t* properties = class_copyPropertyList([self class], &propertyCount);

    for(unsigned int i = 0; i < propertyCount; i++) {
        NSString *selector = [NSString stringWithCString:property_getName(properties[i]) encoding:NSUTF8StringEncoding] ;

        SEL sel = sel_registerName([selector UTF8String]);

        const char* attr = property_getAttributes(properties[i]);
        switch (attr[1]) {
            case '@':
                [string appendString:[NSString stringWithFormat:@"%s : %@\n", property_getName(properties[i]), [self performSelector:sel]]];
                break;
            case 'i':
                [string appendString:[NSString stringWithFormat:@"%s : %i\n", property_getName(properties[i]), [self performSelector:sel]]];
                break;
            case 'f':
                [string appendString:[NSString stringWithFormat:@"%s : %f\n", property_getName(properties[i]), [self performSelector:sel]]];
                break;
            default:
                break;
        }
    }
    free(properties);

    return string;
}
...