Question

Récemment, tout en essayant de répondre à des questions ici, j'ai couru un code de test pour voir comment Xcode / GDB a rapporté la classe d'instances dans clusters de classe . (Voir ci-dessous) Dans le passé, je me suis attendu à voir quelque chose comme:

PrivateClusterClass:PublicSuperClass:NSObject

Comme ce (qui renvoie toujours comme prévu):

NSPathStore2:NSString:NSObject

... pour une chaîne créée avec +[NSString pathWithComponents:].

Cependant, avec NSSet et sous-classe 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 dans le passé, le set cluster classe ne sont pas revenus comme ça.

  1. Qu'est-ce qui a changé? (Je pense qu'il est un changement dans le pont de base Fondation.)
  2. Quel rapport de cluster de classe juste une classe générique par exemple NSCFSet et qui font état d'une sous-classe réelle par exemple NSPathStore2?
  3. Plus important encore, lors du débogage comment déterminez-vous la classe réelle d'une instance de cluster NSSet?
Était-ce utile?

La solution

  1. Un détail de mise en œuvre le plus changé probablement liée à la transition aux FC Si vous regardez attentivement, vous verrez qu'un groupe de la mise en œuvre Objective-C soutenant différentes classes de la Fondation peuvent maintenant être trouvés dans CoreFoundation.

  2. Un autre détail de mise en œuvre. La mise en œuvre des pôles de classe Fondation changement - parfois beaucoup, parfois subtilement - avec chaque version de Mac OS X. L'ensemble exact des classes privées liées à la mise en œuvre est dit généralement de retombées tout ensemble particulier d'exigences ont été nécessaires pour parvenir à une flexibilité et une solution raisonnablement optimale tout en préservant le contrat API des classes destiné au public.

  3. NSCFSet est la classe réelle. Les caractéristiques des cas sont déterminées par la façon dont vous avez alloué en premier lieu. Il n'y a aucun moyen de déterminer si exposé votre jeu est mutable ou immuable. Ceci est en fait exprès; en descendant le chemin d'écrire beaucoup de code que le comportement change en fonction de la mutabilité d'un conduit de cluster de classe à la folie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top