Хранение и извлечение структуры C в NSMutable Array

У меня определена следующая структура C:

typedef struct { float x; плавать у; поплавок г; } метрика;

Я хочу сохранить точки акселерометра в массиве и что-то сделать с ним позже.

Итак, у меня есть изменяемый массив, который инициализируется так в моем методе viewDidLoad:

metricsArray_ = [[[NSMutableArray alloc] init]retain];

в моем методе didAccelerate я создаю структуру для хранения значений и добавляю ее в массив:

metric metricData;
metricData.x = acceleration.x;
metricData.y = acceleration.y;
metricData.z = acceleration.z;

NSValue *metricObject = [[NSValue valueWithBytes:&metricData objCType:@encode(struct metric)]retain];
[metricsArray_ addObject:metricObject];  

Позже, когда я прекращаю опрос данных, я пытаюсь перебрать массив и записать значения, но все значения равны нулю:

NSEnumerator * enumerator = [metricsArray_ objectEnumerator];
id element;
while(element = [enumerator nextObject])
{
    metric metricData;
    [element getValue:&metricData];
    NSLog(@"x=%f,y=%f,z=%f",metricData.x, metricData.y,metricData.z);
}

Что я здесь делаю неправильно? И есть ли лучший способ хранить точки данных акселерометра? Я хотел сохранить их в структуре, а не в объекте (хотя вам все равно придется использовать NSValue)

Спасибо


person imran    schedule 25.08.2010    source источник
comment
К вашему сведению: нет причин когда-либо писать [[[NSMutableArray alloc] init]retain]. Если вы только что получили его от alloc, значит, он у вас уже есть, поэтому его сохранение означает, что теперь вам нужно выпустить его дважды. Сохранение metricObject, вероятно, также неправильно, если вы не выпустите его где-нибудь, что вы нам не показываете.   -  person Chuck    schedule 25.08.2010


Ответы (2)


Моя первоначальная мысль: зачем вам нужна структура метрик, если вы просто используете ее для значений x/y/z. Для этого уже есть объект: UIAcceleration.

У меня есть игра, которая хранит экземпляры UIAcceleration в NSMutableArray примерно 60 раз в секунду по мере их получения в обратном вызове accelerometer:didAccelerate:. Ноль проблем с производительностью.

(Я использую NSMutableArray в качестве «кольцевого буфера». Когда добавлено более N объектов, элементы удаляются с самого начала. Поэтому я просто фиксирую последние N секунд)

person Stefan Arentz    schedule 25.08.2010

Я даже не смог скомпилировать ваш код выше. Мне пришлось внести следующее изменение, удалив структуру в @encode(). Затем это, казалось, компилировалось и работало.

NSValue *metricObject = [NSValue valueWithBytes:&metricData objCType:@encode(metric)];

Там также, кажется, ненужный сохранить.

person No one in particular    schedule 25.08.2010