Dichiarare, Proprietà, sintetizzando, e implementazione di int [] array in Objective C
-
06-09-2019 - |
Domanda
Come si fa a dichiarare, impostare le proprietà, sintetizzare e mettere in atto una serie di int taglia 5 in Objective C? Sto scrivendo questo codice per un iPhone app. Grazie.
Soluzione
Credo 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;
}
Altri suggerimenti
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, si potrebbe scrivere le proprie funzioni di accesso e li hanno malloc / calloc se chiamato prima la matrice è stata allocata.
In entrambi i casi, ti consigliamo di liberare la matrice nel metodo dealloc ().
Questo è probabilmente ingenuo e sbagliato, come sto solo dilagare su Objective C me stesso, ma finora sembra funzionare per me.
Non si deve usare int in questo caso, se si desidera utilizzare un array. Utilizzare NSNumber e mettere quei 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?
Ho una variabile di classe:
NSInteger myInt[5];
In modo che ho potuto usare il myInt normale [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 di simile class.myInt [1] = 0;
Beh, non so per certo questo funziona, ma sembra. Ho solo pensato che avrei messo questo là fuori se qualcun altro vuole provare.
Qualunque cosa tu faccia, è necessario essere consapevoli delle conseguenze.
Un array intero non è il riferimento contato. Tu non sai quante persone accedono esso. Tu non sai chi dovrebbe rilasciare e quando. Così si può facilmente avere una proprietà di tipo int *. Il setter avrà un puntatore e memorizzarlo nella variabile istanza. Il getter restituirà il contenuto della variabile di istanza. Funziona.
TUTTAVIA non si sa quando l'array dovrebbe essere assegnato o deallocato. Se si dispone di alcuni array statici (per esempio quattro diverse tabelle contenenti i numeri), non è un problema. Ma se si crea un array di interi con malloc (), qualcuno dovrebbe liberare () esso. Così, quando è questo sta per accadere?
A causa di dover gestire il ciclo di vita di un array manualmente è spazzatura, mi consiglia che si sia appena utilizza un NSArray di NSNumber, o si guarda NSPointerArray che può essere abusato di array negozio di interi con il conteggio di riferimento, o creare la propria classe come la classe lotteria in una risposta precedente, solo un po 'più flessibile.