2009-05-27 2 views
9

Ich bin neu in Objective-C und Kakao. Ich habe gelesen, dass NSInteger und NSNumber bei der Arbeit mit einfachen Ganzzahlen bevorzugt werden, da sie die "plattformsicheren" Versionen der primitiven numerischen Typen sind (und im Falle von NSNumber in ein Objekt eingeschlossen). Also brauche ich einen Zähler in meiner Klasse, der erhöht wird, wenn ein NSTimer ausgelöst wird. In einem Apple-Forum fand ich eine Gruppe von Leuten, die alle jemandem in einer ähnlichen Situation empfahlen, einen NSNumber-Zeiger in der Kopfzeile zu deklarieren, ihn mit numberWithInt zu initialisieren, und dann jedes Mal, wenn er inkrementiert werden muss, ihn zuzuweisen ein neues Objekt (etwas wie counter = [NSNumber numberWithInt:[counter intValue]+1];). Das sieht für mich nach Overkill aus. Wenn alles was ich brauche ist ein int-Zähler (und übrigens, ich setze es zurück auf 0, nachdem es 15 erreicht hat, so dass die Größe kein Problem ist), kann ich nicht einfach mit einem int davonkommen und muss kein a zuweisen neues Objekt mit jeder Iteration meiner Timer-Schleife?Ist NSNumber Overkill für einen Zähler auf Instanzebene?

Und wenn ja, wie mache ich einen primitiven Typ in meiner Klasse verfügbar. Ich weiß, dass ich es mit Objekttypen in meiner Schnittstelle deklariere und @property und @synthesize benutze ... was ist das Äquivalent (falls vorhanden) bei der Arbeit mit Primitiven?

+0

Zu Ihrer zweiten Frage: Es ist das gleiche, verwenden Sie einfach @property und @synthesize. –

Antwort

15

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

zum Beispiel:

@interface YourViewController : UIViewController { 
NSInteger counter;  
} 

@property (nonatomic,assign) NSInteger counter; 

Die @synthesize ist nur:

@synthesize counter 

und kann entweder erhöht werden, indem :

self.counter += 1; 

oder

counter ++; 

Die spätere wird verhindern, dass alle Beobachter informiert werden, ist also möglicherweise nicht vorzuziehen.

+0

Ich wusste nicht, dass + = Eigenschaften bearbeitet ... dank @gs –

9

NSNumber ist eine Objektdarstellung einer Zahl. Ich verwende es beim Speichern von Zahlen in einer Sammlungsklasse, da sie nur Objektzeiger enthalten können.

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

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

Um Primitive in Ihrer Klasse verfügbar zu machen - nun, wenn Sie es in der Kopfzeile als iVar deklarieren, ist es sowieso in Ihrer Klasse verfügbar. @property und @synthesize sind nur Objective-C 2.0-Möglichkeiten, diese als Eigenschaften zu deklarieren, die außerhalb Ihrer Klasse KVC/KVO-konform gesehen (und möglicherweise geändert) werden können. Primitive Typen können als Eigenschaften verwendet werden, indem dieselbe Syntax @property und @synthesize verwendet wird.

4

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

1

Ich stimme mit Ihrem Instinkt überein, die Verwendung eines Objekts für einen einfachen Zähler klingt wie Overkill und wird eine unnötige Anzahl von Nachrichtenversandaufrufen hinzufügen, um einfach einen Zähler inkrementieren zu können. Für einen Zähler, der nicht in einer Sammlung gespeichert oder als Objekt bearbeitet werden muss, bleiben Sie bei C-Skalartypen.

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

@interface MyClass: NSObject{ 
    int counter; 
} 

@end 
0

Wenn Sie Notwendigkeit tun eine NSNumber (wie für eine NSManagedObject Eigenschaft) I zu erhöhen fanden diese Kategorie geholfen:

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

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

so können Sie die Schrittweite Aussagen vereinfachen zu:

counter = [counter increment]; 
Verwandte Themen