【问题标题】:Storing and retrieving C struct in NSMutable Array在 NSMutable 数组中存储和检索 C 结构
【发布时间】:2010-08-25 02:11:17
【问题描述】:

我定义了以下 C 结构:

typedef 结构 { 浮动 x; 浮动y; 浮动z; } 指标;

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

所以我有一个可变数组,在我的 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 )

谢谢

【问题讨论】:

  • 仅供参考:没有理由写 [[[NSMutableArray alloc] init]retain]。如果刚刚从alloc 获得它,那么您已经拥有它,所以保留它只是意味着您现在必须两次 发布它。保留metricObject 也可能是错误的,除非你将它释放到你没有向我们展示的地方。

标签: iphone objective-c ios-simulator


【解决方案1】:

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

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

(我将NSMutableArray 用作“环形缓冲区”。当添加的对象超过 N 个时,项目会从头开始删除。所以我只捕获最后 N 秒)

【讨论】:

    【解决方案2】:

    我什至无法编译您上面的代码。我必须对删除@encode() 中的结构进行以下更改。这似乎可以编译并工作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多