2009-05-26 8 views
7

Come dichiarare, impostare proprietà, sintetizzare e implementare un array int di dimensione 5 nell'obiettivo C? Sto scrivendo questo codice per un'app per iPhone. Grazie.Dichiarazione, proprietà, sintetizzazione e implementazione di int [] array nell'obiettivo C

+1

se non riesci a superare questo passaggio, ti raccomando caldamente che DEVE VERAMENTE ottenere il libro di Aaron Hillegas sulla programmazione Cocoa. – KevinDTimm

+0

Il fatto è che so che potrei farla franca usando un NSMutableArray o semplicemente avere 5 distinti in quanto la dimensione è fissata a 5, ma avere una serie di intere sarebbe molto più elegante. Mi piacerebbe anche sapere come sarà il futuro. Ho scritto in molte altre lingue, ma non riesco a trovare una risposta definitiva su come farlo nell'obiettivo c per l'iphone. –

risposta

9

Penso che la cosa "cacao-y" da fare è nascondere l'array int, anche se lo si utilizza internamente. Qualcosa di simile:

@interface Lottery : NSObject { 
    int numbers[5]; 
} 

- (int)numberAtIndex:(int)index; 
- (void)setNumber:(int)number atIndex:(int)index; 
@end 

@implementation Lottery 

- (int)numberAtIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    return numbers[index]; 
} 

- (void)setNumber:(int)number atIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    numbers[index] = number; 
} 
+0

Questo è eccessivo. Usa un array C. –

+0

Come potrei farlo? Penso che sia quello che intendevo fare originariamente con l'array int. –

+0

Questo * è * usando un array C, Roger. Ma rimuove tutte le seccature di memcpy e dettagli di basso livello che non appartengono davvero all'interfaccia Cocoa. – Chuck

0

Non si deve utilizzare int in questo caso se si desidera utilizzare un array. Utilizzare NSNumber e inserire i 5 NSNumbers in un NSMutableArray.

@interface testClass: NSObject { 
    NSMutableArray* numbers; 
} 
@property (nonatomic, retain) NSMutableArray* numbers; 
-(id)initWithValue:(NSNumber *)initialValue; 
@end 


@implementation testClass 
@synthesize numbers; 
-(id)initWithValue:(NSNumber *)initialValue { 
    numbers = [[NSMutableArray alloc] initWithCapacity:5]; 
    [numbers addObject:initialValue]; 
    return self; 
} 
@end 

È il codice per l'interfaccia e l'implementazione con sintetizzare (non testato BTW). Cosa stai cercando di realizzare?

Good quick intro

+0

Grazie per la rapida risposta. La ragione per cui volevo utilizzare una serie di int è che sto cercando di memorizzare 5 numeri casuali/univoci tra 1: 1000 e volevo una struttura semplice per verificare se ogni int successivo è unico. Sembra che questo sarà molto più difficile utilizzando NSMutableArray. Che cosa suggerisci? –

+0

Ah, quindi forse in un ciclo for si controlla se intArray [i] == intArray [i-1] fallisce? È certamente più sovraccarico usando gli oggetti objc, potrebbe essere semplicemente meglio usare int []. Riesci a mantenere l'array intero come variabile locale nel metodo che stai generando? O hai bisogno che sia una proprietà accessibile della classe? – ryanday

+0

Voglio che sia una variabile di istanza perché la classe fa parte del modello in un MVC. Tuttavia, l'overhead aggiuntivo sarebbe significativo se la dimensione fosse solo 5? –

0

ho una variabile di classe:

NSInteger myInt[5]; 

così che ho potuto utilizzare la normale myInt [1] = 0 sintassi nel mio codice, ho creato una proprietà che restituisce un puntatore intero :

@property (nonatomic, readonly) NSInteger *myInt; 

poi ha creato il seguente metodo getter:

-(NSInteger *) myInt { 
    return myInt 
} 

Ora posso usare qualcosa come class.myInt [1] = 0;

Beh, non so per certo che funzioni, ma sembra. Ho solo pensato di metterlo là fuori se qualcun altro voleva provarlo.

2

Ecco qualcosa da provare. Nel file .h:

@property int* myIntArray; 

Poi, nel file .m:

@synthesize myIntArray; 

Se si utilizza @synthesize, avrete bisogno di malloc/calloc l'array da soli, probabilmente durante init ().

In alternativa, è possibile scrivere le proprie funzioni di accesso e disporre di esse malloc/calloc se chiamate prima che l'array sia stato allocato.

In entrambi i casi, è necessario liberare l'array nel metodo dealloc().

Questo è probabilmente ingenuo e sbagliato, visto che mi sto avvicinando all'obiettivo C, ma finora sembra funzionare per me.

+0

+1 Ottima prima risposta! – bakoyaro

0

Qualunque cosa tu faccia, devi essere consapevole delle conseguenze.

Un array intero non è conteggiato. Non sai quante persone ci stanno accedendo. Non sai chi dovrebbe dirlo e quando. Quindi puoi facilmente avere una proprietà di tipo int *. Il setter prenderà un puntatore e lo memorizzerà nella variabile di istanza. Il getter restituirà il contenuto della variabile di istanza. Funziona e basta.

TUTTAVIA non si sa quando l'array deve essere allocato o deallocato. Se si dispone di alcuni array statici (ad esempio quattro diverse tabelle contenenti numeri), nessun problema.Ma se crei un array di interi con malloc(), qualcuno dovrebbe liberarlo(). Allora, quando succederà?

Perché la gestione della durata di un array manualmente è spazzatura, io consiglio di utilizzare solo un NSArray di NSNumber o di guardare NSPointerArray che può essere abusato per memorizzare matrici di interi con conteggio di riferimento, o crei la tua classe come la classe della Lotteria in una risposta precedente, solo un po 'più flessibile.