Objective-C: Получение истинного класса классов в классовых кластерах

StackOverflow https://stackoverflow.com/questions/2840972

Вопрос

Недавно, пытаясь ответить на вопросы здесь, я управлял некоторым тестовым кодом, чтобы увидеть, как XCode / GDB сообщил о классе экземпляров в классовые кластеры. Отказ (См. Ниже) В прошлом я ожидал увидеть что-то вроде:

PrivateClusterClass:PublicSuperClass:NSObject

Например, это (который все еще возвращается как ожидалось):

NSPathStore2:NSString:NSObject

... для строки, созданной с +[NSString pathWithComponents:].

Однако с NSSET и подклассом следующий код:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    NSSet *s=[NSSet setWithObject:@"setWithObject"];
    NSMutableSet *m=[NSMutableSet setWithCapacity:1];
    [m addObject:@"Added String"];
    NSMutableSet *n = [[NSMutableSet alloc] initWithCapacity:1];
    [self showSuperClasses:s];
    [self showSuperClasses:m];
    [self showSuperClasses:n];
    [self showSuperClasses:@"Steve"];   
}

- (void) showSuperClasses:(id) anObject{
    Class cl = [anObject class];
    NSString *classDescription = [cl description];
    while ([cl superclass]) 
    {
        cl = [cl superclass];
        classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]];
    }
    NSLog(@"%@ classes=%@",[anObject class], classDescription);
}

... Выходы:

// NSSet *s
NSCFSet classes=NSCFSet:NSMutableSet:NSSet:NSObject
//NSMutableSet *m
NSCFSet classes=NSCFSet:NSMutableSet:NSSet:NSObject
//NSMutableSet *n
NSCFSet classes=NSCFSet:NSMutableSet:NSSet:NSObject
// NSString @"Steve"
NSCFString classes=NSCFString:NSMutableString:NSString:NSObject

Отладчик показывает тот же класс для всех установленных экземпляров. Я знаю, что в прошлом кластер класса набор не вернулся так.

  1. Что изменилось? (Я подозреваю, что это изменение моста из основного фонда.)
  2. Какой класс кластера сообщает только об универсальном классе, например, NSCFSET и который сообщает о фактическом подклассе, например, NSPathStore2?
  3. Самое главное, при отладке Как определить фактический класс экземпляра кластера NSSet?
Это было полезно?

Решение

  1. Деталь внедрения, скорее всего, связана с преобразованием до CF. Если вы посмотрите внимательно, вы увидите, что куча реализации объектов-С, поддерживающих различные классы на основе объекта, теперь можно найти в CoreFoundation.

  2. Другая деталь реализации. Реализация кластеров классовых классов фонда - иногда сильно, иногда, тонко - с каждым выпуском Mac OS X. Точный набор частных классов, связанных с указанной реализацией, - это, как правило, от любой конкретный набор требований, необходимых для достижения гибкого и достаточно оптимальное решение, а также сохранение договора API общественных классов облицовок.

  3. NSCFSET является фактический класс. Особенности экземпляров определяются тем, как вы выделили его в первую очередь. Нет открытого способа определить, является ли ваш набор мультипным или неизменным. Это на самом деле специально; Сдвиньте по пути написания многих кодов, которые меняют поведение на основе мультипликации кластера класса кластера класса приводит к безумии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top