Объявление, свойства, синтез и реализация массива int[] в Objective C

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

Вопрос

Как вы объявляете, устанавливаете свойства, синтезируете и реализуете массив 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, которым можно злоупотреблять для хранения массивов целых чисел с подсчетом ссылок, либо создать свой собственный класс, подобный классу лотереи в предыдущем ответе, только немного более гибкий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top