2009-05-26 10 views
7

Wie deklarieren Sie, setzen Sie Eigenschaften, synthetisieren und implementieren Sie ein int-Array der Größe 5 in Objective C? Ich schreibe diesen Code für eine iPhone App. Vielen Dank.deklarieren, Eigenschaften, synthetisieren und implementieren int [] -Array in Objective C

+1

Wenn Sie über diesen Schritt nicht hinaus kommen, empfehle ich Ihnen, dass Sie WIRKLICH Aaron Hillegas Buch über Kakao-Programmierung bekommen müssen. – KevinDTimm

+0

Die Sache ist, dass ich weiß, dass ich mit der Verwendung eines NSMutableArray oder einfach 5 separate Eingänge bekommen könnte, da die Größe auf 5 festgelegt ist, aber eine Reihe von Ints wäre viel eleganter. Ich würde auch gerne wissen, wie für die Zukunft. Ich habe in mehreren anderen Sprachen geschrieben, aber ich kann einfach keine definitive Antwort finden, wie es in objective c für das iPhone geht. –

Antwort

9

Ich denke, das „Cocoa-y“, was das int-Array zu tun verstecken, auch wenn Sie es intern verwenden. Etwas wie:

@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

Das ist Overkill. Verwenden Sie ein C-Array. –

+0

Wie würde ich das tun? Ich denke, das ist es, was ich ursprünglich mit dem int-Array tun wollte. –

+0

Das * ist * mit einem C-Array, Roger. Aber es beseitigt den ganzen Aufwand von Memcpy und Low-Level-Details, die nicht wirklich in eine Cocoa-Oberfläche gehören. – Chuck

0

Sie sollten in diesem Fall nicht int verwenden, wenn Sie ein Array verwenden möchten. Verwenden Sie NSNumber und fügen Sie diese 5 NSNumbers in ein NSMutableArray ein.

@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 

Ist der Code für die Schnittstelle und Implementierung mit synthetisieren (BTW nicht getestet). Was versuchst du zu erreichen?

Good quick intro

+0

Danke für die schnelle Antwort. Der Grund, warum ich ein Array von Ints verwenden wollte, ist, dass ich versuche, 5 zufällige/eindeutige Zahlen zwischen 1: 1000 zu speichern, und ich wollte eine einfache Struktur, um zu überprüfen, ob jeder nachfolgende int eindeutig ist. Es scheint, dass dies mit NSMutableArray viel schwieriger wird. Was schlagen Sie vor? –

+0

Ahh, also vielleicht in einer for-Schleife überprüfen Sie, ob intArray [i] == intArray [i-1] dann fehlschlagen? Es ist sicherlich mehr Overhead mit den Objc-Objekten, es ist vielleicht besser, int [] zu verwenden. Können Sie das Integer-Array als lokale Variable in der Methode beibehalten, in der Sie die Zahlen generieren? Oder benötigen Sie eine zugängliche Eigenschaft der Klasse? – ryanday

+0

Ich möchte, dass es eine Instanzvariable ist, weil die Klasse Teil des Modells in einem MVC ist. Wäre der zusätzliche Overhead jedoch signifikant, wenn die Größe nur 5? –

0

Ich habe eine Klassenvariable:

NSInteger myInt[5]; 

Damit ich die normalen myInt [1] = 0 Syntax in meinem Code verwenden könnte, habe ich eine Eigenschaft, die einen Integer-Zeiger zurückzugibt :

@property (nonatomic, readonly) NSInteger *myInt; 

dann die folgende Getter-Methode erstellt:

-(NSInteger *) myInt { 
    return myInt 
} 

Jetzt kann ich etwas wie class.myInt [1] = 0 verwenden;

Nun, ich weiß nicht sicher, das funktioniert, aber es scheint zu. Ich dachte nur, ich würde das hier veröffentlichen, wenn jemand anderes es versuchen möchte.

2

Hier ist etwas zu versuchen. In der H-Datei:

@property int* myIntArray; 

Dann wird in der .m-Datei:

@synthesize myIntArray; 

Wenn Sie @synthesize verwenden, müssen Sie malloc/calloc das Array selbst, wahrscheinlich während der init ().

Alternativ könnten Sie Ihre eigenen Accessor-Funktionen schreiben und sie malloc/calloc haben, wenn sie aufgerufen werden, bevor das Array zugewiesen wurde.

In beiden Fällen möchten Sie das Array in der Dealloc() -Methode freigeben.

Das ist wahrscheinlich naiv und falsch, da ich gerade auf Objective C aufsteige, aber bisher scheint es für mich zu funktionieren.

+0

+1 Große erste Antwort! – bakoyaro

0

Was auch immer Sie tun, Sie müssen sich der Konsequenzen bewusst sein.

Ein Integer-Array wird nicht gezählt. Sie wissen nicht, wie viele Personen darauf zugreifen. Sie wissen nicht, wer und wann es ausplanen sollte. Sie können also ganz einfach eine Eigenschaft vom Typ int * haben. Der Setter nimmt einen Zeiger und speichert ihn in der Instanzvariablen. Der Getter gibt den Inhalt der Instanzvariablen zurück. Es funktioniert einfach.

ABER Sie wissen nicht, wann das Array zugewiesen oder freigegeben werden sollte. Wenn Sie einige statische Arrays haben (zum Beispiel vier verschiedene Tabellen mit Zahlen), kein Problem.Aber wenn Sie ein Array von ganzen Zahlen mit malloc() erstellen, sollte jemand es frei(). Wann wird das passieren?

Da der manuelle Umgang mit der Lebensdauer eines Arrays Müll ist, würde ich empfehlen, entweder ein NSArray NSNumber zu verwenden oder NSPointerArray zu betrachten, das zum Speichern von Ganzzahl-Arrays mit Referenzzählung missbraucht werden kann Sie erstellen Ihre eigene Klasse wie die Lotterie-Klasse in einer früheren Antwort, nur ein bisschen flexibler.

Verwandte Themen