Objective-C: Получение истинного класса классов в классовых кластерах
-
27-09-2019 - |
Вопрос
Недавно, пытаясь ответить на вопросы здесь, я управлял некоторым тестовым кодом, чтобы увидеть, как 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
Отладчик показывает тот же класс для всех установленных экземпляров. Я знаю, что в прошлом кластер класса набор не вернулся так.
- Что изменилось? (Я подозреваю, что это изменение моста из основного фонда.)
- Какой класс кластера сообщает только об универсальном классе, например, NSCFSET и который сообщает о фактическом подклассе, например, NSPathStore2?
- Самое главное, при отладке Как определить фактический класс экземпляра кластера NSSet?
Решение
Деталь внедрения, скорее всего, связана с преобразованием до CF. Если вы посмотрите внимательно, вы увидите, что куча реализации объектов-С, поддерживающих различные классы на основе объекта, теперь можно найти в CoreFoundation.
Другая деталь реализации. Реализация кластеров классовых классов фонда - иногда сильно, иногда, тонко - с каждым выпуском Mac OS X. Точный набор частных классов, связанных с указанной реализацией, - это, как правило, от любой конкретный набор требований, необходимых для достижения гибкого и достаточно оптимальное решение, а также сохранение договора API общественных классов облицовок.
NSCFSET является фактический класс. Особенности экземпляров определяются тем, как вы выделили его в первую очередь. Нет открытого способа определить, является ли ваш набор мультипным или неизменным. Это на самом деле специально; Сдвиньте по пути написания многих кодов, которые меняют поведение на основе мультипликации кластера класса кластера класса приводит к безумии.