Как использовать двумерный массив объектов Objective-C? - PullRequest
1 голос
/ 13 июля 2009

У меня есть двумерный массив C объектов Objective-C. Как я могу получить доступ к членам этих объектов?

id array[5][5];
array[0][0] = [[Ball alloc] init];

Класс Ball состоит из двух членов:

int size;
CGPoint point;

Как мне получить доступ к размеру объекта Ball, хранящегося в массиве [0] [0]? Пожалуйста, скажите мне, как я могу это сделать.

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 13 июля 2009

В зависимости от того, какое время выполнения (32-разрядное или 64-разрядное) и от того, объявили ли вы переменные экземпляра (size и point) явным образом или синтезировали их во время выполнения, вы можете получить к ним доступ напрямую в array[0][0]->size. Однако это не очень хорошая идея . Он сломается в современных средах выполнения и очень не способом Objective-C и нарушает инкапсуляцию, публично раскрывая детали реализации класса.

В Objective-C 2.0 правильной практикой является объявление свойства для каждого атрибута, который вы хотите, чтобы он был политически видимым. Добавьте следующее к объявлению Ball @interface:

@property (assign) int size;
@property (assign) CGPoint point;

А в блоке @implementation Ball:

@synthesize size;
@synthesize point;

Теперь вы можете получить доступ к размеру, например ((Ball*)array[0][0]).size. Приведение требуется, чтобы компилятор распознал точечную запись как доступ к свойству. Это не требуется, если вы используете методы доступа (которые автоматически генерируются @synthesize): [array[0][0] size].

2 голосов
/ 13 июля 2009

Хотя это может быть не совсем уместно для вашего вопроса (и, возможно, вы просто используете упрощенный пример), но почему бы в этом случае не использовать структуры вместо объектов? Поскольку и размер, и точка не являются объектами, это может иметь больше смысла.

1 голос
/ 13 июля 2009

Вы можете сделать это так:

@interface Moo : NSObject {
@public
    int age;
}

И тогда вы можете сделать это без предупреждения:

Moo *m = [[Moo alloc] init];
m->age = 16;
Moo *arr[4];
arr[0] = m;
printf("Age: %d",arr[0]->age);

Вы также можете сделать кастинг:

id arr[4];
arr[0] = m;
printf("Age: %d",((Moo *)arr[0])->age);

Это должно работать с любым количеством измерений массивов! Надеюсь, это поможет.

...