Domanda

Sono nuovo di Objective-C e Cocoa. Ho letto che NSInteger e NSNumber sono preferiti quando si lavora con semplici interi perché sono le versioni "piattaforma-sicuri" dei tipi numerici primitivi (e nel caso di NSNumber, avvolti in un oggetto). Così, ho bisogno di un contatore nella mia classe che viene incrementato quando un NSTimer incendi. Su un forum di Apple ho trovato un gruppo di persone tutte raccomandare a qualcuno in una situazione simile che quel popolo dichiari un puntatore NSNumber nell'intestazione, inizializzarla con numberWithInt :, quindi ogni volta che ha bisogno di essere incrementato farlo assegnando a un nuovo oggetto (qualcosa come counter = [NSNumber numberWithInt:[counter intValue]+1];). Questo appare come eccessivo per me. Se tutto quello che serve è un contatore int (e btw, sto Ripristino di nuovo a 0 dopo che colpisce 15 così formato non è un problema), non posso uscire solo con utilizzando un int e non hanno di destinare una nuovo oggetto con ogni iterazione del ciclo di mio timer?

E se sì, come faccio a fare un tipo primitivo disponibile in tutta la mia classe. So che con tipi di oggetti, dichiaro nella mia interfaccia e utilizzare @property e @synthesize ... qual è l'equivalente (se presente) quando si lavora con le primitive?

È stato utile?

Soluzione

Utilizzando NSNumber per un semplice contatore ha un aspetto un po 'di più di uccidere. È possibile dichiarare i membri della classe come NSInteger e semplicemente aggiornarli utilizzando ++ o + =

Ad esempio:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

Il @synthesize è solo:

@synthesize counter

e può essere incrementato mediante:

self.counter += 1;

o

counter ++;

il seguito impedirà eventuali osservatori di essere informato, quindi potrebbe non essere preferibile.

Altri suggerimenti

NSNumber è una rappresentazione oggetto di un numero. Io lo uso quando la memorizzazione dei numeri in una classe di raccolta perché possono contenere solo i puntatori di oggetto.

Quindi nel tuo esempio, che ha bisogno di un contatore, probabilmente è eccessivo.

NSInteger è semplicemente un numero intero che è typedefed di essere al sicuro per 32 e 64 bit programmi, ed è consigliato da Apple per l'uso invece di int. E non è un oggetto. Questo è probabilmente quello che serve per un contatore (in realtà NSUInteger, che è un unsigned int) potrebbe essere migliore.

Per quanto riguarda rendere primitive a disposizione per tutta la classe - bene, se si dichiara che nell'intestazione come iVar, è disponibile in tutto la classe in ogni modo. @property e @synthesize sono solo Objective-C 2.0 modi per dichiarare questi come proprietà che può essere visto (e forse modificati) al di fuori della classe in modo conforme KVC / KVO. tipi primitivi possono essere usati come utilizzando la stessa sintassi @property e @synthesize.

Io uso NSInteger (non int, per essere più portatile), e avvolgerlo in un NSNumber se ho bisogno di aggiungerlo a una raccolta (ad esempio un NSMutableDictionary durante il salvataggio dello stato di smettere l'applicazione).

Sono d'accordo con il tuo istinto, utilizzando un oggetto per un semplice contatore suona come eccessivo e aggiungerò un numero non necessario di chiamate messaggio di spedizione semplicemente per incrementare un contatore. Per un contatore che non ha bisogno di essere memorizzati in una raccolta o manipolato come oggetto, bastone con tipi C scalari.

Per dichiarare uno scalare come una variabile della classe esempio, solo dichiararla nel file di intestazione:

@interface MyClass: NSObject{
  int counter;
}

@end

Se do necessità di incrementare un NSNumber (ad esempio per una proprietà NSManagedObject) ho trovato questa categoria ha aiutato:

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

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

in modo da poter semplificare le dichiarazioni di incremento a:

counter = [counter increment];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top