Frage

Vor kurzem bei dem Versuch, noch eine Frage hier zu beantworten, ich lief einigen Test-Code zu sehen, wie Xcode / GDB die Klasse von Fällen, in berichtete Klasse Cluster . (Siehe unten) In der Vergangenheit habe ich erwartet, so etwas wie zu sehen:

PrivateClusterClass:PublicSuperClass:NSObject

Wie dies (die immer noch wie erwartet zurückgibt):

NSPathStore2:NSString:NSObject

... für eine Zeichenkette mit +[NSString pathWithComponents:] erstellt.

Doch mit NSSet und Unterklasse des folgenden Code:

- (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);
}

... Ausgänge:

// 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

Der Debugger zeigt die gleiche Klasse für alle Set-Instanzen. Ich weiß, dass in der Vergangenheit die Set-Klasse Cluster nicht so zurückgekommen.

  1. Was hat sich geändert? (Ich vermute, es ist eine Änderung in der Brücke von Core Foundation).
  2. Was Klasse Cluster Bericht nur eine generische Klasse z.B. NSCFSet und die berichten über eine tatsächliche Unterklasse z.B. NSPathStore2?
  3. Am wichtigsten ist, beim Debuggen wie Sie die tatsächliche Klasse einer NSSet Cluster-Instanz bestimmen?
War es hilfreich?

Lösung

  1. Eine Implementierung Detail verändert höchstwahrscheinlich auf die Überbrückung zu CF. bezogen Wenn Sie genau hinsehen, werden Sie sehen, dass in Corefoundation zu finden ist jetzt ein Bündel von der Objective-C-Implementierung verschiedene Foundation Klassen sichern.

  2. Eine weitere Implementierung Detail. Die Implementierung der Foundation Class-Cluster ändern - manchmal stark, manchmal subtil - mit jeder neuen Version von Mac OS X. Die genaue Menge von Privatunterricht auf die Implementierung im Zusammenhang ist in der Regel Fallout von was auch immer bestimmtem Satz von Anforderungen benötigt wurden ein flexibles zu erreichen und einigermaßen optimale Lösung, während auch den API-Vertrag der Öffentlichkeit zu bewahren gegenüber Klassen.

  3. NSCFSet die tatsächliche Klasse. Die Merkmale der Instanzen werden dadurch bestimmt, wie Sie es in erster Linie zugeordnet. Es gibt keine exponierte Art und Weise zu bestimmen, ob Ihr Set wandelbar oder unveränderlich ist. Dies ist eigentlich absichtlich; hinunter den Weg der viel Code zu schreiben, die Verhaltensänderungen auf der Grundlage der Veränderlichkeit einer Klasse Cluster führt zu Wahnsinn.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top