Объявление, свойства, синтез и реализация массива int[] в Objective C
-
06-09-2019 - |
Вопрос
Как вы объявляете, устанавливаете свойства, синтезируете и реализуете массив int размером 5 в Objective C?Я пишу этот код для приложения для iPhone.Спасибо.
Решение
Я думаю, что "Какао-у" - это скрыть массив int, даже если вы используете его внутри.Что-то вроде:
@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;
}
Другие советы
Вот что стоит попробовать.В файле .h:
@property int* myIntArray;
Затем в файле .m:
@synthesize myIntArray;
Если вы используете @synthesize, вам придется самостоятельно выполнить malloc/calloc для массива, возможно, во время init().
В качестве альтернативы вы можете написать свои собственные функции доступа и использовать их malloc/calloc, если они вызываются до выделения массива.
В любом случае вам понадобится освободить массив с помощью метода Dealloc().
Вероятно, это наивно и неправильно, поскольку я сам только приступаю к Objective C, но пока мне кажется, что это работает.
В этом случае вам не следует использовать int, если вы хотите использовать массив.Используйте NSNumber и поместите эти 5 NSNumbers в 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
Это код интерфейса и реализации с помощью синтеза (кстати, не проверялся).Что вы пытаетесь достичь?
У меня есть переменная класса:
NSInteger myInt[5];
Чтобы использовать в своем коде обычный синтаксис myInt[1]=0, я создал свойство, возвращающее целочисленный указатель:
@property (nonatomic, readonly) NSInteger *myInt;
Затем создал следующий метод получения:
-(NSInteger *) myInt {
return myInt
}
Теперь я могу использовать что-то вроде class.myInt[1]=0;
Ну, я не уверен, что это работает, но кажется, что это так.Я просто подумал, что выложу это здесь, если кто-то еще захочет это попробовать.
Что бы вы ни делали, вы должны осознавать последствия.
Целочисленный массив не учитывает ссылки.Вы не знаете, сколько людей имеют к нему доступ.Вы не знаете, кто должен его освободить и когда.Таким образом, вы можете легко получить свойство типа int*.Установщик возьмет указатель и сохранит его в переменной экземпляра.Геттер вернет содержимое переменной экземпляра.Это просто работает.
ОДНАКО вы не знаете, когда массив должен быть выделен или освобожден.Если у вас есть статические массивы (например, четыре разные таблицы, содержащие числа), нет проблем.Но если вы создадите массив целых чисел с помощью malloc(), кто-то должен его освободить().Так когда же это произойдет?
Поскольку необходимость обрабатывать время жизни массива вручную — это чушь, я бы рекомендовал вам либо просто использовать NSArray NSNumber, либо посмотреть NSPointerArray, которым можно злоупотреблять для хранения массивов целых чисел с подсчетом ссылок, либо создать свой собственный класс, подобный классу лотереи в предыдущем ответе, только немного более гибкий.