Objective-C: Ottenere la Classe vera delle classi in cluster di livello
-
27-09-2019 - |
Domanda
Recentemente durante il tentativo di rispondere a domande qui, mi sono imbattuto qualche codice di prova per vedere come Xcode / gdb ha riportato la classe delle istanze di cluster di livello . (Vedi sotto) In passato, ho aspettavo di vedere qualcosa di simile:
PrivateClusterClass:PublicSuperClass:NSObject
Come questo (che ancora restituisce come previsto):
NSPathStore2:NSString:NSObject
... per una stringa creata con +[NSString pathWithComponents:]
.
Tuttavia, con NSSet e sottoclasse il seguente codice:
- (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);
}
... uscite:
// 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
Gli spettacoli debugger la stessa classe per tutte le istanze Set. So che in passato cluster Set di classe non ha prodotto come questo.
- Che cosa è cambiato? (Ho il sospetto che è un cambiamento nel ponte dal Core Foundation.)
- Che rapporto grappolo classe solo una classe generica per esempio NSCFSet e che riportano effettivamente una sottoclasse per esempio NSPathStore2?
- La cosa più importante, quando il debug come si fa a determinare la classe reale di un'istanza del cluster NSSet?
Soluzione
-
Un dettaglio di implementazione cambiato molto probabilmente legati al ponte a CF. Se si guarda da vicino, vedrete che un gruppo di realizzazione Objective-C backup varie classi della Fondazione si trova ora in CoreFoundation.
-
Un altro dettaglio attuazione. L'implementazione della Fondazione cluster di livello cambiamento - a volte notevolmente, a volte in modo sottile - con ogni versione di Mac OS X. L'insieme esatto di classi private legate a tale implementazione è generalmente ricaduta da qualsiasi particolare insieme di requisiti sono stati necessari per ottenere un flessibile e la soluzione ottimale ragionevolmente preservando il contratto API del pubblico confrontato classi.
-
NSCFSet la classe reale. Le caratteristiche dei casi sono determinati da come è assegnato in primo luogo. Non c'è modo esposto per determinare se il set è mutabile o immutabile. Questo è in realtà di proposito; scendendo il percorso di scrivere un sacco di codice che cambia il comportamento in base alla mutevolezza di un cluster di classe porta a follia.