Deklarieren, Eigenschaften, Synthetisierung und Implementieren von int [] Array in Objective C

StackOverflow https://stackoverflow.com/questions/912016

Frage

Wie erklären Sie, stellen Sie Eigenschaften, synthetisieren und implementieren ein int Array der Größe 5 in Objective C? Ich schreibe diesen Code für eine iPhone App. Danke.

War es hilfreich?

Lösung

Ich denke, das „Cocoa-y“, was zu tun ist, um den Int-Array verstecken, auch wenn Sie es intern verwenden. So 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;
}

Andere Tipps

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

@property int* myIntArray;

Dann werden in der .m-Datei:

@synthesize myIntArray;

Wenn Sie @synthesize verwenden, werden Sie zu malloc benötigen / calloc das Array selbst, wahrscheinlich während der init ().

Alternativ können Sie Ihre eigenen Accessorfunktionen schreiben und sie malloc / calloc wenn aufgerufen, bevor das Array zugeordnet ist.

So oder so, wollen Sie das Array in der dealloc () -Methode befreien.

Dies ist wahrscheinlich naiv und falsch, wie ich auf Objective C bis ich bin nur Ramping, aber bisher scheint es für mich zu arbeiten.

Sie sollten nicht int in diesem Fall verwenden, wenn Sie ein Array verwenden möchten. Verwenden Sie NSNumber und setzen diese 5 NSNumbers in eine 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

Ist der Code für die Schnittstelle und Implementierung mit synthesize (nicht BTW getestet). Was wollen Sie erreichen?

Gute kurze Einführung

Ich habe eine Klassenvariable:

NSInteger myInt[5];

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

@property (nonatomic, readonly) NSInteger *myInt;

Dann erstellt die folgende Getter-Methode:

-(NSInteger *) myInt {
  return myInt
}

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

Nun, ich weiß es nicht sicher, dass dies funktioniert, aber es scheint. Ich dachte, ich würde diese dort lösche, wenn jemand anderes will, es versuchen.

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

Ein Ganzzahl-Array wird nicht gezählt Referenz. Sie wissen nicht, wie viele Menschen es zugreifen. Sie wissen nicht, wer es freigeben sollte und wann. So können Sie ganz leicht haben eine Eigenschaft vom Typ int *. Der Setter wird einen Zeiger und speichert sie in die Instanzvariable. Der Getter wird den Inhalt der Instanzvariablen zurück. Es funktioniert einfach.

JEDOCH Sie nicht wissen, wenn das Array zugeordnet werden soll oder ausgeplant. Wenn Sie einige statischen Arrays (zum Beispiel vier verschiedene Tabellen mit Zahlen), kein Problem. Aber wenn Sie ein Array von ganzen Zahlen mit malloc () zu erstellen, jemand sollte es frei (). Also, wenn wird dies geschehen?

Da die Lebensdauer eines Arrays zu handhaben, die von Hand Müll ist, würde ich empfehlen, dass Sie entweder nur eine NSArray von NSNumber verwenden, oder Sie schauen auf NSPointerArray, die zum Speichern von Arrays von ganzen Zahlen mit Referenzzählung missbraucht werden kann, oder Sie erstellen Sie Ihre eigene Klasse, wie die Lotterie-Klasse in einer früheren Antwort, nur ein bisschen flexibler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top