2012-04-11 2 views
1

Wie kann ich Wertunterschiede zwischen zwei Objekten des gleichen Typs finden. Zum Beispiel habe ich eine Rectangle-Klasse mit x-, y-, width-, height-Eigenschaften und zwei Objekten der rectangle-Klasse. Wie kann ich (entweder programmgesteuert oder mit einem Visualisierungstool oder einer Bibliothek usw.) feststellen, welche Eigenschaften eines Rechtecks ​​sich vom zweiten Rechteck unterscheiden?Wie finden Sie feine Unterschiede zwischen zwei Objekten in Objective C

Oder gibt es eine Möglichkeit, Objektstatus auf der Konsole oder in einer Datei zu erhalten?

Antwort

3

Die anderen Antworten sind nur gut, wenn Sie tatsächlich die Klasse der Objekte in Zeit kompilieren wissen. Wenn dies nicht der Fall ist, haben Sie immer noch Glück, denn mit Objective C können Sie die Instanzvariablen Ihres Objekts zur Laufzeit untersuchen. Ein Pseudo-Code zum Vergleich zweier unbekannter Objekte könnte sein:

+ (BOOL) compareObject:(id)obj1 withObject:(id)obj2 { 

    unsigned int varCount1, varCount2; 
    if ([obj1 class] != [obj2 class]) return NO; 

    Ivar *vars1 = class_copyIvarList([obj1 class], &varCount1); 
    Ivar *vars2 = class_copyIvarList([obj2 class], &varCount2); 
    BOOL match = YES; 

    for (int i = 0; i < varCount1; i++) { 
    Ivar var1 = vars1[i]; 

    for (int j = 0; i < varCount2; j++) { 
     Ivar var2 = vars2[j]; 
     if (strcmp(ivar_getName(var1), ivar_getName(var2)) == 0) { 
      if (object_getIvar(obj1, var1) != object_getIvar(obj2, var2)) { 
      match = NO; 
      break; 
      } 
     } 
    } 

    if (!match) break; 

    } 

    free(vars1); 
    free(vars2); 

    return match; 
} 
+0

Einfach, vielen Dank. –

+0

Dies wird verschiedene Objekte finden, die wirklich gleich sind, wie zum Beispiel: 'NSStrings' mit demselben Inhalt, aber verschiedenen Klassen (da' NSString' eigentlich ein Klassencluster ist, keine Klasse) und Objekte, die Ivars für Metadaten verwenden anstatt Identität/Inhalt. Das könnte natürlich für Ihren Fall in Ordnung sein. :) –

+1

Meine Absicht war es, dem Fragesteller zu zeigen, dass es ein Werkzeug gibt, um die Instanzvariablen in Ziel c zu untersuchen, aus diesem Grund habe ich "Pseudocode" geschrieben. Wie er sie verwenden wird, wie man die Ergebnisse filtert und verfeinert, ist mehr auf seinen spezifischen Fall ausgerichtet. – MrTJ

0

Wenn Sie die Beschreibung des Objekts drucken, werden Sie über die Werte informiert.

Für zB.,

CGRect rect = CGRectMake(10,10,20,20); 
Rectangle *rectObject = [[Rectangle alloc] initWithFrame:rect]; 
NSLog(@"Desc : %@",[rectObject description]); 

Auch, wenn Sie vergleichen wollen,

können Sie x Ursprung von NSLog(@"Origin x: %f", rectObject.frame.origin.x);

erhalten Sie ähnliche y Herkunft von NSLog(@"Origin y: %f", rectObject.frame.origin.y);

bekommen Sie können die Breite erhalten,

NSLog(@"Width : %f", rectObject.frame.size.width); 
NSLog(@"Height : %f", rectObject.frame.size.height); 
0

wenn x, y etc. sind Schwimmer dann übernehmen RECT1 und RECT2 sind zwei Objekte dann

NSLog(@"for Rect1 \nx %f y %f \nFor Rect2 \nx %f y%f",Rect1.x,Rect1.y,Rect2.x,Rext2.y); 

dies die x und y von RECT1 und RECT2 zeigen jeweils

0

Wenn Sie überprüfen möchten, ob zwei Variablen zeigen auf die gleiche Instanz, Sie können sie mit obj1 == obj2 vergleichen.

Wenn Sie überprüfen möchten, ob zwei verschiedene Instanzen Ihrer Klasse dieselben Elementwerte haben, müssen Sie jeden Wert einzeln überprüfen. (zB obj1.property1 == obj2.property2).

Wenn Sie nur das gleiche überprüfen möchten, während des Debuggens, fügen Sie einfach einen Haltepunkt ein und schauen Sie in den Debug-Bereich von xcode. Sie können dort alle lebenden Objekte inspizieren. Drücke einfach den Pfeil rechts neben deinem Objekt. Lokale Variablen (die zum Zeitpunkt des Breakpoins existieren) werden direkt aufgelistet, die Mitglieder werden in sich selbst gefaltet.

Verwandte Themen