Инициализация класса Objective-C ivar, который является массивом C - PullRequest
4 голосов
/ 16 декабря 2011

У меня есть ивар в моем классе Obj-C, это массив C (я не заинтересован в том, чтобы сделать его свойством Obj-C). Достаточно просто. Теперь в методе init моего класса я хотел бы заполнить этот массив некоторыми значениями, используя сокращенную запись init массива C, как показано в моем .m ниже. Но я вполне уверен, что это создание локальной переменной с тем же именем и не инициализация моей переменной экземпляра. Я не могу поместить свой массив init в интерфейс, и я не могу объявить ivar в реализации. Я просто застрял, делая какое-то глубокое копирование или у меня есть другой вариант?

В GameViewController.h

#define kMapWidth 10
#define kMapHeight 10

@interface GameViewController : UIViewController
{
    unsigned short map[kMapWidth * kMapHeight];
}

@end

В GameViewController.m

- (id)init
{
    if ((self = [super init]))
    {
        unsigned short map[kMapWidth * kMapHeight] = { 
            1,1,1,1,1,1,1,1,1,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,1,1,1,1,1,1,1,1,1,
        };
    }
    return self;
}

1 Ответ

5 голосов
/ 16 декабря 2011

Вы правы. То, что вы делаете, это инициализация локальной переменной, затемнение переменной экземпляра. Вы можете инициализировать локальный массив и memcpy в переменную экземпляра:

static const unsigned short localInit[] = { 
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,1,1,1,
};

memcpy(map, localInit, sizeof(localInit));
...