2010-08-25 53 views
0

我有以下C结构定义:存储和检索的C结构中NSMutable阵列

typedef结构{ 浮X; float y; float z; } metric;

我想将加速度计点存储在一个数组中,稍后再做一些操作。

所以我有一个是在我的viewDidLoad方法初始化像这样一个可变的数组:

metricsArray_ = [[[NSMutableArray里的alloc] INIT]保留];

我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

仅供参考:没有理由永远写[[[[[NSMutableArray alloc] init] retain]。如果刚从'alloc'中获得它,你已经拥有了它,所以保留它意味着你现在必须释放它*两次*。保留'metricObject'可能也是错误的,除非你在某个你没有显示的地方释放它。 – Chuck 2010-08-25 03:47:39

回答

1

我最初的想法是:为什么你需要一个指标结构,如果你只是用它来x/y/z值。已经有一个对象:UIAcceleration

我有一个游戏,它存储UIAcceleration的实例NSMutableArray约每秒60次,因为它们在accelerometer:didAccelerate:回调中收到。零性能问题。

(我使用的NSMutableArray作为“环形缓冲器”。当大于N obejcts更多已被添加,项都从一开始就去除。这样我刚捕获上次N秒)

0

我不能”你甚至可以编译上面的代码。我必须进行以下更改,以移除@encode()中的结构。这似乎是编译和工作。

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

似乎还有一个不必要的保留。