Frage

Ich bin neu in Objective-C und Cocoa. Ich habe gelesen, dass NSInteger und NSNumber bevorzugt, wenn mit einfachen ganzen Zahlen arbeiten, weil sie die „Plattform-safe“ Versionen der primitiven numerischen Typen sind (und in NSNumber Fall, in einem Objekt eingewickelt). Also, ich brauche einen Zähler in meiner Klasse, wenn ein NSTimer Feuer erhöht wird. Auf einem Apple-Forum fand ich eine Gruppe von Menschen, alle mit jemandem in einer ähnlichen Situation zu empfehlen, dass sie einen NSNumber Zeiger im Header erklären sollte, initialisieren es mit numberWithInt :, und dann jedes Mal erhöht werden muss dies tun, indem sie die Zuordnung zu ein neues Objekt (so etwas wie counter = [NSNumber numberWithInt:[counter intValue]+1];). Das sieht aus wie viel des Guten für mich. Wenn alles was ich brauche einen int-Zähler (und btw, ich bin das Zurücksetzen auf 0 zurück, nachdem er trifft 15 so Größe kein Problem ist), kann ich nicht entkommen mit nur ein int verwenden und müssen nicht zuteilen neues Objekt mit jeder Iteration meines Timer-Schleife?

Und wenn ja, wie kann ich eine primitive Art während meiner Klasse zur Verfügung zu stellen. Ich weiß, dass mit Objekttypen, ich habe es in meiner Schnittstelle deklarieren und verwenden @property und @synthesize ... was ist das Äquivalent (falls vorhanden), wenn sie mit Primitiven zu arbeiten?

War es hilfreich?

Lösung

Mit NSNumber für einen einfachen Zähler sieht ein wenig über töten. Sie können die Teilnehmer, wie NSInteger erklären und einfach aktualisieren, um sie mit ++ oder + =

Beispiel:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

Die @synthesize ist nur:

@synthesize counter

und kann erhöht werden, indem entweder:

self.counter += 1;

oder

counter ++;

die später werden alle Beobachter verhindern, informiert zu werden, könnten somit nicht bevorzugt sein.

Andere Tipps

NSNumber ist eine Objektdarstellung einer Zahl. Ich benutze es, wenn Zahlen in einer Sammlung Klasse zu speichern, weil sie nur Objektzeiger halten können.

Also in Ihrem Beispiel, das einen Zähler benötigt, ist es wahrscheinlich übertrieben.

NSInteger ist einfach eine ganze Zahl, die für 32- und 64-Bit-Programme sicher sein typedefed ist, und wird von Apple für die Verwendung anstelle von int empfohlen. Es ist kein Objekt. Dies ist wahrscheinlich das, was Sie brauchen für einen Zähler (eigentlich NSUInteger, die ein unsigned int ist) könnte besser sein.

Wie bei Primitiven verfügbar in Ihrer Klasse zu machen - gut, wenn man es im Header als iVar erklärt, ist es auf jedem Fall in Ihrer Klasse zur Verfügung. @property und @synthesize sind nur Objective-C 2.0 Möglichkeiten, diese als Eigenschaften zu erklären, die (und vielleicht geändert) außerhalb der Klasse in einer KVC / KVO-konformen Weise zu sehen sind. Primitive Typen können als Eigenschaften verwendet werden, um die gleiche @property und @synthesize Syntax.

Ich benutze NSInteger (nicht int, mehr tragbar zu sein), und in eine NSNumber wickeln, wenn ich es zu einer Sammelstelle (wie ein NSMutableDictionary wenn beim Verlassen der Anwendung, den Status zu speichern) hinzufügen muß.

Ich bin mit Ihrem Instinkt, ein Objekt für einen einfachen Zähler klingt wie viel des Guten mit und wird eine unnötige Anzahl von Botschaftsabsendung fordert einfach Inkrementieren eines Zählers hinzuzufügen. Für einen Zähler, der in einer Sammlung gespeichert werden muss oder als Objekt manipuliert, Stick mit C skalare Typen nicht.

Um einen Skalar als Instanzvariable der Klasse zu erklären, erklären sie nur in Ihrer Header-Datei:

@interface MyClass: NSObject{
  int counter;
}

@end

Wenn Sie Sie müssen eine NSNumber (wie für eine NSManagedObject Eigenschaft) erhöhen, fand ich diese Kategorie geholfen haben:

@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end

@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
    return [NSNumber numberWithInt:[self intValue]+1];
}
@end

so können Sie die Schrittweite Anweisungen vereinfachen zu:

counter = [counter increment];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top