Récemment, en essayant de répondre à une question ici, j'ai exécuté un code de test pour voir comment Xcode/gdb a signalé la classe d'instances dans class clusters. (Voir ci-dessous) Dans le passé, je me suis attendu à voir quelque chose comme:Objective-C: Obtenir la classe True des classes dans les clusters de classe
PrivateClusterClass:PublicSuperClass:NSObject
Tels que ce (qui renvoie toujours comme prévu):
NSPathStore2:NSString:NSObject
... pour une chaîne créée avec +[NSString pathWithComponents:]
.
Cependant, avec NSSet et sous-classement le code suivant:
- (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);
}
... Sorties:
// 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
Le débogueur montre la même classe pour toutes les instances Set. Je sais que par le passé le cluster de classe Set ne revenait pas comme ça.
- Qu'est-ce qui a changé? (Je soupçonne qu'il s'agit d'un changement dans le pont de Core Foundation.)
- Quel rapport de classe classe juste une classe générique par ex. NSCFSet et qui signalent une sous-classe réelle, par ex. NSPathStore2?
- Plus important encore, lors du débogage, comment déterminez-vous la classe réelle d'une instance de cluster NSSet?
C'est à peu près ce que je pensais. Cela peut faire en sorte que le débogage du code d'autres utilisateurs soit un défi lorsque vous n'êtes pas sûr d'avoir initialisé les choses comme il se doit. – TechZen