2010-05-15 9 views
2

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.

  1. Qu'est-ce qui a changé? (Je soupçonne qu'il s'agit d'un changement dans le pont de Core Foundation.)
  2. 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?
  3. Plus important encore, lors du débogage, comment déterminez-vous la classe réelle d'une instance de cluster NSSet?

Répondre

3
  1. Un détail de mise en œuvre le plus changé probablement liée à la transition aux FC Si vous y regardez de plus près, vous verrez qu'une partie de l'implémentation Objective-C supportant diverses classes Foundation peut maintenant être trouvée dans CoreFoundation.

  2. Un autre détail d'implémentation. La mise en œuvre des clusters de classe Foundation change - parfois considérablement, parfois subtilement - avec chaque version de Mac OS X. L'ensemble exact de classes privées liées à cette implémentation dépend généralement de l'ensemble des besoins particuliers requis pour atteindre une flexibilité. et une solution raisonnablement optimale tout en préservant le contrat API des classes publiques. NSCFSet

  3. est la classe réelle. Les caractéristiques des instances sont déterminées par la manière dont vous les avez allouées en premier lieu. Il n'y a aucun moyen exposé de déterminer si votre ensemble est mutable ou immuable. C'est en fait exprès; aller dans le sens de l'écriture de beaucoup de code qui change de comportement basé sur la mutabilité d'un cluster de classe conduit à la folie.

+0

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

Questions connexes