Недавно, пытаясь ответить на вопросы здесь, я запустил тестовый код, чтобы увидеть, как 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
Отладчик показывает один и тот же класс для всех экземпляров Set. Я знаю, что в прошлом кластер классов Set не возвращался таким образом.
- Что изменилось? (Я подозреваю, что это изменение моста от Core Foundation.)
- Какой класс кластера сообщает просто общий класс, например NSCFSet и который сообщает фактический подкласс, например NSPathStore2?
- Самое главное, при отладке, как определить фактический класс экземпляра кластера NSSet?