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.
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:
print-object currentRow
verwenden, ändern Sie es in print currentRow
. NSLog("%@", currentRow)
verwenden, ändern Sie es in NSLog(%"ld", (long)currentRow)
. 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]]
. 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.
Tags und Links objective-c macos cocoa