2012-06-23 91 views
0

我想通過for循環遍歷NSArray。即使int變量i正確打印(0,1,2 ...),結果也只返回數組中的最後一個值。另外,如果我設置迭代說5,我會得到數組中的第6個對象,這是正確的。我這樣做是爲了縮小可能原因的範圍。NSArray沒有迭代

任何想法?

int i; 
int j; 
Buffer *vocalBuffer; 
for (i=0; i < numberOfBuffers; i++){ // loop through every vocal buffer 

    Buffer *mixedBuffer = [[Buffer alloc] init]; 
    int array[sizeLoopBuff]; 
    mixedBuffer.buffer = array; 
    mixedBuffer.numFrames = sizeLoopBuff; 
    NSLog(@"Vocal buffer number --> %i", i); 
    NSInteger iteration = i; 
    vocalBuffer = [arrayOfVocalBuffers objectAtIndex:iteration]; // grab the vocal buffer 

    for (j=0; j < sizeLoopBuff; j++){ // run through a beat loop cycle. 
     mixedBuffer.buffer[j] = loopBuffer.buffer[j]; // add the beats to return buffer. 
     if (j > insertPoint && j < insertPoint+ vocalBuffer.numFrames){ 
      mixedBuffer.buffer[j] = loopBuffer.buffer[j] + vocalBuffer.buffer[j-insertPoint]; 
     } 
    } 
    [mutArray addObject:mixedBuffer]; 
} 
+0

你的問題有點混亂。你說結果返回數組中的最後一個值?如果結果是「'vocalBuffer'」,那麼它當然會檢索最後一個objectAtIndex值。或者是你正在尋找其他東西的結果呢? –

+2

這不好:'int array [sizeLoopBuff]; mixedBuffer.buffer = array;'。您正在for循環的本地數據塊中指定一個動態分配對象的屬性。 –

+0

@MichaelDautermann嗯...也許我犯了一個明顯的錯誤,我看不到。我正在嘗試創建一個'mixedBuffers'數組,每個數組包含'vocalBuffer'和'loopBuffer'。每個'vocalBuffer'都是不同的,但我的輸出是一個'混合緩衝區'的數組,每個緩衝區都包含最後一個'vocalBuffer'。 –

回答

2

正如在註釋中指出的那樣,使用指向堆棧存儲的指針存在一些問題。一個是,雖然它在範圍內,但它的內容被循環中的每一次使用所覆蓋;指向它的單個對象沒有唯一的副本。

另一個問題是,一旦方法返回並且不需要它的堆棧空間(就運行時而言),就不會預測這個空間會做什麼。

每個對象具有唯一緩衝區的必要行爲表明對象應該在創建時動態分配其自己的緩衝區。

+0

你也可以考慮讓你的'Buffer'類擁有'buffer'屬性的'NSMutableData'。你可能有一個方法' - (void *)bufferBytes {return [self.buffer mutableBytes]; }來提供對緩衝區字節的簡單訪問。原因在於允許更簡單的內存管理,特別是如果您使用ARC(我希望您或代碼泄漏)。 –