在NSMutableArray中存储和检索C结构

时间:2010-08-25 02:11:17

标签: iphone objective-c ios-simulator

我定义了以下C Struct:

typedef struct {     浮动x;     漂浮y;     漂浮z; } metric;

我想将加速度计点存储在一个数组中,稍后再用它做一些事情。

所以我有一个在我的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)

谢谢

2 个答案:

答案 0 :(得分:1)

我最初的想法是:如果你只是将它用于x / y / z值,为什么还需要一个度量结构。已有一个对象:UIAcceleration

我有一款游戏可以UIAcceleration的{​​{1}}个实例在NSMutableArray回调中收到,每秒约60次。零性能问题。

(我使用accelerometer:didAccelerate:作为'环形缓冲区'。当添加了超过N个对象时,项目将从头开始删除。所以我只捕获了最后N秒)

答案 1 :(得分:0)

我甚至无法编译上面的代码。我必须在@encode()中删除结构进行以下更改。这似乎是编译和工作。

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

似乎也有不必要的保留。