Объявление, свойства, синтез и реализация массива int [] в Objective C - PullRequest
7 голосов
/ 26 мая 2009

Как вы объявляете, устанавливаете свойства, синтезируете и внедряете массив int размера 5 в Objective C? Я пишу этот код для приложения для iPhone. Спасибо.

Ответы [ 5 ]

9 голосов
/ 26 мая 2009

Я думаю, что Cocoa-y нужно скрыть массив 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;
}
2 голосов
/ 18 ноября 2011

Вот что попробовать. В файле .h:

@property int* myIntArray;

Затем в файле .m:

@synthesize myIntArray;

Если вы используете @synthesize, вам придется самостоятельно распределять / вызывать массив, вероятно, во время init ().

В качестве альтернативы, вы можете написать свои собственные функции доступа и использовать их malloc / calloc, если они были вызваны до выделения массива.

В любом случае вы захотите освободить массив в методе dealloc ().

Это, вероятно, наивно и неправильно, так как я сам накапливаю Objective C, но пока, похоже, это работает для меня.

0 голосов
/ 20 февраля 2014

Что бы вы ни делали, вы должны знать о последствиях.

Целочисленный массив не считается ссылкой. Вы не знаете, сколько людей получают к нему доступ. Вы не знаете, кто должен освободить это и когда. Таким образом, вы можете довольно легко иметь свойство типа int *. Установщик возьмет указатель и сохранит его в переменной экземпляра. Получатель вернет содержимое переменной экземпляра. Это просто работает.

ОДНАКО вы не знаете, когда массив должен быть выделен или освобожден. Если у вас есть статические массивы (например, четыре разных таблицы, содержащие числа), проблем не возникает. Но если вы создаете массив целых чисел с помощью malloc (), кто-то должен его освободить (). Так когда же это произойдет?

Поскольку обрабатывать время жизни массива вручную - это мусор, я бы рекомендовал либо просто использовать NSArray из NSNumber, либо посмотреть на NSPointerArray, который можно использовать для хранения массивов целых чисел с помощью подсчета ссылок, либо создайте свой собственный класс, подобный классу лотереи в предыдущем ответе, просто более гибко.

0 голосов
/ 05 октября 2009

У меня есть переменная класса:

NSInteger myInt[5];

Чтобы я мог использовать обычный синтаксис myInt [1] = 0 в своем коде, я создал свойство, которое возвращает целочисленный указатель:

@property (nonatomic, readonly) NSInteger *myInt;

Затем создал следующий метод получения:

-(NSInteger *) myInt {
  return myInt
}

Теперь я могу использовать что-то вроде class.myInt [1] = 0;

Ну, я точно не знаю, работает ли это, но, похоже, так и есть. Я просто подумал, что я это сделаю, если кто-то еще захочет попробовать.

0 голосов
/ 26 мая 2009

Вы не должны использовать 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

Это код для интерфейса и реализации с синтезом (не проверено BTW). Что вы пытаетесь достичь?

Хорошее быстрое вступление

...