NSInteger ist auf 0 gesetzt, gibt aber nil zurück

8

Ich habe einen NSInteger in meiner Klasse wie so

In @interface:

%Vor%

In @ Implementierung:

%Vor%

Doing [self setCurrentRow:0] scheint gut zu funktionieren, aber die Verwendung von [self currentRow] gibt nur aus irgendeinem Grund null zurück, nicht sicher warum. Bei der Verwendung von Haltepunkten kann ich sehen, dass der Wert für currentRow 0 ist, also hat es sich gut eingestellt, aber ich kann den Wert nicht zurückbekommen.

    
BytesGuy 09.10.2011, 22:29
quelle

3 Antworten

15

In Objective-C ist es wichtig, dass Sie zwischen Objekten und primitiven Typen unterscheiden.

Ein Objekt wird immer als ein Zeiger gespeichert, der die Position des Objekts im Speicher darstellt. Ein Zeiger ist nur eine Zahl. Mit NSLog können Sie %p verwenden, um diesen Wert anzuzeigen. Sie können es auch im Debugger anzeigen: print myObject . Ein Zeiger wird als Hexadezimalzahl mit dem Präfix 0x angezeigt. nil ist im Wesentlichen Standort Null ( 0x0000 ). Wenn Sie irgendeine Art von Objekt zuweisen, erhalten Sie einen Zeiger, der nicht Null ist. Wenn Sie einer Variablen ein Objekt zuweisen, kopieren Sie einfach die Speicheradresse und duplizieren das Objekt nicht. Mit NSLog können Sie %@ verwenden, um die description eines Objekts auszudrucken. Im Debugger, wie folgt: print-object myObject .

Primitive Typen wie NSInteger sind keine Objekte. Anstatt einen Zeiger zu speichern, speichern Sie den Wert normalerweise einfach. Wenn Sie eine Variable NSInteger zuweisen, erstellen Sie eine Kopie des Werts. Sie können den Wert im Debugger mit print sehen. Oder so: NSLog("%ld", (long)currentRow) . Wenn Sie ein Grundelement zuweisen, kopieren Sie dessen Wert. Verwenden Sie nicht %@ oder print-object mit Primitiven - sie erwarten Objekte.

(Ich sage "normalerweise speichern Sie einfach den Wert", weil Sie auch Zeiger auf primitive Typen machen können. In Situationen wie Ihrer ist dies jedoch nicht notwendig.)

[self currentRow] gibt 0 zurück, genau wie Sie es festgelegt haben. (Da Objective-C außerdem die Initialisierung von Instanzvariablen garantiert, gibt es 0 zurück, auch wenn es nicht festlegt.)

Das Problem ist, dass Sie einen Zeiger auf ein Objekt erwarten. Wie Sie Ihren Code reparieren, hängt davon ab, wie Sie ihn verwenden:

  • Wenn Sie print-object currentRow verwenden, ändern Sie es in print currentRow .
  • Wenn Sie NSLog("%@", currentRow) verwenden, ändern Sie es in NSLog(%"ld", (long)currentRow) .
  • Wenn Sie currentRow woanders verwenden, wo ein Objekt benötigt wird, ändern Sie die Instanzvariable und die Eigenschaftstypen in NSNumber * , einen Objekttyp. Setze es mit [self setCurrentRow:[NSNumber numberWithInt:0]] .
paulmelnikow 10.10.2011, 22:14
quelle
6

NSInteger ist kein Objekt, es ist typedef in int oder so ähnlich. Wenn Sie also currentRow auf 0 setzen und dann versuchen, es zurück zu bekommen, ist null (aka 0) ein völlig korrekter Wert.

    
Nicky 09.10.2011 22:31
quelle
3

Die Getter-Methode wird als - (NSInteger)currentRow synthetisiert, also sollte es gut funktionieren. Aber wie überprüfen Sie, ob es funktioniert? Mit NSLog(@"%@", ...) ? Dann sollten Sie %d verwenden.

Wenn Sie möchten, dass es ein Objekt ist, sollten Sie NSNumber und eine retain -Eigenschaft verwenden.

    
Mattias Wadman 09.10.2011 22:47
quelle

Tags und Links