2010-07-17 3 views
10

Ich habe gerade erst begonnen, in meinen iPhone-Projekten synthetisierte Instanzvariablen zu verwenden. Das Problem ist, dass ich die synthetisierten Ivars im Debugger nicht sehen kann. Gibt es eine Möglichkeit, die Eigenschaften eines Objekts im Debugger anzuzeigen, wenn die explizit deklarierten Instanzvariablen nicht verwendet werden?Den Wert einer synthetisierten Eigenschaft im Xcode-Debugger sehen, wenn es keine unterstützende Variable gibt


Ich muss die zweite Frage klären. Ich frage nicht, wie man auf Eigenschaften zugreift oder was sie tun; Ich kenne das ganze Zeug. Ich hatte den Eindruck, dass Sie Instanzvariable nicht direkt zugreifen können, wenn Sie synthetisierte Ivars basierend auf this post verwenden. Ich war eindeutig in der Lage zu tun, was ich bisher für unmöglich hielt. Ich frage mich, was los ist.

Ich benutze Xcode 3.2.4/iPhone Simulator/LLVM Compiler 1.5.

Antwort

9

Edited Antwort auf den zweiten Teil hinzuzufügen:

Dieses auf Xcode funktioniert 3.1 so sehe ich nicht, warum es später Versionen

nicht funktioniert direkt, was Sie tun können, ist Nachrichten senden auf das Objekt von der Konsole beim Debuggen.

Vermutlich haben Sie an einem Haltepunkt angehalten und Sie sehen sich die Variablen in der Debug-Ansicht an. Bei Objekten zeigen diese die Zeiger an. Sie können die iVar nicht sehen, aber Sie haben den Zeiger auf das Objekt, und Sie können es Nachrichten senden. zum Beispiel:

  • Sie haben
  • Die Variablenansicht zeigt die Zeigeradresse von self zu sein (sagen wir) 0x1031380 an einem gewissen Haltepunkt innerhalb des Objekts gestoppt.
  • In der Konsole geben Sie po [0x1031380 title] (beachten Sie, dass es kein Semikolon gibt) und geben Sie
  • Sie sollten sehen, was Sie in der Konsole möchten.

Wenn Sie eine Eigenschaft mit (retain) deklarieren und anschließend die Eigenschaft synthetisieren, sind Sie zu schaffen Setter, der das Objekt/Wert an sie übergeben behalten. so in Ihrem Fall oben sollten Sie umschreiben die Methode als:

- (void)viewDidLoad { 
    self.title = @"woah"; 
} 

Und die Zeichenfolge wird als Teil der Setter beibehalten werden. Außerdem bevorzuge ich (copy) für Klassencluster, die veränderbare/unveränderliche Paare haben (NSString, NSSet, NSArray, usw.). Auf diese Weise kann die Eigenschaft nicht extern geändert werden.

+2

Eigentlich ist es nicht so ein Fall von Präferenz, wie Sie sollten * Kopiereigenschaften für NSString etc verwenden, es sei denn, Sie haben einen sehr guten Grund nicht zu. – JeremyP

+0

Ich habe den Dummy-Code losgeworden, da er Verwirrung stiftete, und ich klärte den zweiten Teil meiner Frage. – kubi

+2

'po [0x1031380 titel]' Das ist die Antwort, danke! Wenn ich Textbefehle verwende, um iVars zu sehen, und keinen Schutz davor, direkt auf iVars zuzugreifen, bedeutet das, dass ich wahrscheinlich keine synthetisierten iVars mehr verwenden werde. Es ist ein Schmerz und es scheint mir nichts nützliches zu geben. – kubi

5

Sie müssen nicht den Zeiger/die Adresse der Variablen verwenden. Stattdessen können Sie den Variablennamen wie folgt verwenden:

po [myVar title] 

Xcode wird Ihnen helfen, den Variablennamen (myVar oben) zu geben, wenn die Variable im Rahmen ist.

0

Wenn Sie nicht manuell po [blahblah] geben möchten, können Sie tun, was xnav here vorgeschlagen, in dem Sie entweder explizit Sie Instanzvariablen im Header deklarieren, oder „in der Variablen Debug-Bereich klicken Sie rechts auf‚Selbst‘und wählen Sie "Add Expression", dann geben Sie zB 'ein _wordLength 'und der ivar wird angezeigt "

Verwandte Themen