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.

  1. Che cosa è cambiato? (Ho il sospetto che è un cambiamento nel ponte dal Core Foundation.)
  2. Che rapporto grappolo classe solo una classe generica per esempio NSCFSet e che riportano effettivamente una sottoclasse per esempio NSPathStore2?
  3. La cosa più importante, quando il debug come si fa a determinare la classe reale di un'istanza del cluster NSSet?
È stato utile?

Soluzione

  1. 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.

  2. 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.

  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top