2012-04-05 17 views
0

So habe ich ein paar Eigenschaften, die ich in einigen Beispielcode verwende, mit denen ich spiele. Insbesondere die "tag" -Eigenschaft der UIView-Klasse. Jetzt setze ich diese Eigenschaft, und wenn ich NSLogle, oder Steueranweisungen basierend auf dem Wert von Tag einrichten, kann ich sehen, dass der Wert, den ich gesetzt habe, dort ist und wie erwartet reagiert wird.Debuggen von Eigenschaften in XCode

Wenn ich jedoch den Mauszeiger über die .tag halte, um zu sehen, welcher Tag-Wert da ist, bekomme ich von XCode gar nichts. Kein Popup zeigt den Wert an. Also gehe ich zum auto/local/all Fenster und versuche "Ausdruck hinzufügen ..." (Scheint, dass das die einzige Möglichkeit ist, eine traditionelle "Uhr" Variable einzurichten, wenn es einen anderen Weg gibt, lass es mich wissen). Jedenfalls setze ich mein object.tag in das "watch" -Fenster und es ist leer. Kein Wert. Es ist nicht Null, es ist einfach nichts, als ob es nicht existierte.

Natürlich, wenn ich die Maus über den "Objekt" -Teil von "object.tag" schwenke, dann bekomme ich ein Popup für das Objekt mit dem Offenlegungsrechteck, das ich expandiere, dann suche ich nach "_tag" (Dies scheint die zugrunde liegende Instanzvariable zu sein.

Was ist so schwer daran? Warum ist die Tag-Eigenschaft während des Debug-Vorgangs nicht sichtbar, indem Sie einfach darauf klicken? Hat das etwas mit Eigenschaften in XCode Dev zu tun?

PS - Ich bin die neueste Version von XCode ausgeführt wird: 4.3.2

+0

Ich meinte Offenlegung TRIangle, nicht Rechteck :) – Chris

Antwort

1

Die tag Eigenschaft, wie jede andere Objective-C-Eigenschaft ist ein syntaktischer Zucker. Tatsächlich werden Eigenschaften als Zugriffsmethoden implementiert, die wiederum in Funktionsaufrufe objc_msgSend() übersetzt werden. Diese Maschinerie ist nichts wie der Zugriff auf ein Strukturfeld.

Der Debugger kann grundsätzlich jedes Feld in einer Struktur anzeigen, da es keine speziellen Kenntnisse erfordert und keine Konsequenzen hat. Nur die Strukturdefinition wird benötigt. Um den Wert einer Objective-C-Eigenschaft zu erhalten, muss andererseits Code im Prozesskontext ausgeführt werden. Sie können das manuell in der Debugger-Konsole tun, aber der Debugger wird dies nicht automatisch tun.

Ich denke, das ist theoretisch noch möglich in Einzelfällen, aber unglaublich schwer. Betrachten Sie einen Fall, in dem das Ausführen einer Zugriffsmethode den internen Zustand des Objekts ändert. Wenn Sie beispielsweise -[UIViewController view] aufrufen (indem Sie auf die Eigenschaft view zugreifen), wird die Ansicht geladen. Es können auch Delegate-Methoden aufgerufen werden usw. In solchen Fällen würde das Bewegen des Mauszeigers über die Eigenschaft in IDE den Ausführungsstatus des Prozesses verändern und somit das Debuggen selbst zu einem Witz machen.

+0

Ich war mir bewusst, dass die Eigenschaft ist syntaktischer Zucker, aber ich habe das nicht zu dem Ergebnis, dass Sie darauf hingewiesen. Danke, dass du es aufgeräumt hast. Zumindest werde ich nicht weiter nach etwas suchen, das nicht existiert. Zu einem verwandten Hinweis, wie gehen Sie im Allgemeinen über die Erkennung des Namens, der von der Eigenschaft umschlossen ist? Zum Beispiel stolperte ich einfach über _tag als die zugrunde liegende Variable, die das property-Tag einwickelte. Ich hasse es anzunehmen, dass das, wonach ich suche, nur eine vorangestellte Unterstreichung hat, also gibt es eine einfache Möglichkeit, dies zu entdecken? Ich überprüfe die Dokumente und habe nichts gesehen. – Chris

+0

Im Allgemeinen gibt es keine Korrelation zwischen einer Eigenschaft und einem ivar, da Eigenschaften "dynamisch" sein können, d. H. Ein Wert, der im Flug berechnet wird. Ich schaue nie auf Ivar-Werte, es sei denn, es ist meine Klasse und ich weiß wer wer ist. Zum Beispiel enthalten einige Klassen von Apple veraltete Ivars, Ivars ohne offensichtlichen Zweck, verschleierte und sogar versteckte Ivars (meistens ein Objekt einer privaten Klasse). Im Allgemeinen ist es beim Debuggen sinnvoll, sich auf das Verhalten Ihres eigenen Codes zu konzentrieren, auf den Sie unbegrenzten Zugriff haben. – Costique

+0

Ich sehe, also dann, wenn ich etwas wie die UIView verfolgen.Tag (etwas aus einer anderen Klasse) meine einzige echte Option dann, wenn ein Problem in Bezug auf eine solche "Black Box" Eigenschaft debuggen manuell im Ausgabefenster drucken? – Chris

Verwandte Themen