2010-08-25 84 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)];

似乎還有一個不必要的保留。