Objective-C: Obtenir la classe vraie des classes dans les clusters de classe
-
27-09-2019 - |
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.
- Qu'est-ce qui a changé? (Je pense qu'il est un changement dans le pont de base Fondation.)
- 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?
- Plus important encore, lors du débogage comment déterminez-vous la classe réelle d'une instance de cluster NSSet?
La solution
-
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.
-
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.
-
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.