2012-07-23 62 views
0

關於爲什麼下面指出的行將引發異常的任何線索?例外 - 數組檢查的邊界是不對的?

-(double)calibrationValueAtIndex:(int)index 
{ 
    NSLog(@"count: %d index: %d",[theTopValues count], index); 
    return [[theTopValues objectAtIndex:index] doubleValue]; // exception happening here 
} 

2012-07-23 21:51:16.448 TestAppTimerAndHits[15130:f803] count: 9 index: 7 
2012-07-23 21:51:22.339 TestAppTimerAndHits[15130:f803] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSOrderedSetM objectAtIndex:]: index 7 beyond bounds [0 .. 4]' 

怎麼能在該行的NSLog 9計數之前,則在異常報告說,邊界是[0 .. 4]

異常似乎是隨機拋出的..在某些情況下,數組邊界是好的,這意味着我可以在索引8處獲得對象...但是有些時候,它會報告範圍低至[0 .. 2]

鑑於控制器(僅VC一個項目中的)

theBufferManager = [[HitBufferManager的alloc] INIT];

在.h文件中

: @property NSMutableOrderedSet * theTopValues;

在.m文件

: @synthesize theTopValues;對於HitBufferManager的(id)初始化: theTopValues = [NSMutableOrderedSet orderedSetWithCapacity:numToStore]; //返回一個自動發佈的版本。

中的各個項目添加/編輯:

 [self sortTopValues]; 

     if([theTopValues count]<numToStore) 
     { 
      [theTopValues addObject:[NSNumber numberWithDouble:windowVal]]; 
     } 
     else if(logVal> [[theTopValues objectAtIndex:0] doubleValue]) 
     { 
      [theTopValues replaceObjectAtIndex:0 withObject:[NSNumber numberWithDouble:logVal]]; 
     } 
+2

這不是一個多線程程序的片段,是嗎? – dasblinkenlight 2012-07-23 20:09:58

+0

我想知道...並想知道我是否在內存管理方面做了一些錯誤。我猜測出於某種原因,數組中的元素正在被垃圾收集?它是一個iOS/iPhone應用程序,我沒有做任何事情來使它成爲多線程,但它是我的第一個應用程序,所以我可能不知道它試圖多線程的東西嗎? – DoYouLikeHam 2012-07-23 20:21:45

+0

如果是iOS版本,則不存在GC,只有裁判計數。不過,你可能有一個懸而未決的參考。你用ARC嗎? – dasblinkenlight 2012-07-23 20:32:41

回答

0

嘗試改變:在.h文件中:@property NSMutableOrderedSet * theTopValues;

在h文件:@property(強)NSMutableOrderedSet * theTopValues;

看看是否能解決它。

+0

nope,增加(強)似乎沒有區別。 – DoYouLikeHam 2012-07-23 21:03:53

+0

但是...讓我想知道爲什麼它報告:__NSCFNumber自動釋放沒有到位 – DoYouLikeHam 2012-07-23 21:05:45

0

這確實是一個多線程的問題。在我正在排序和修改NSOrderedSet的代碼位周圍放置一個@synchronized {}似乎可以清除我讀回的部分中的問題。我現在的問題是試圖找出我的其他線程來自哪裏。是否

CADisplayLink* gameTimer; 
gameTimer = [CADisplayLink displayLinkWithTarget:self 
             selector:@selector(updateDisplay:)]; 

[gameTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

和/或這是否啓動線程?

AudioUnitSetProperty(_effectState.rioUnit, 
         kAudioUnitProperty_SetRenderCallback, 
         kAudioUnitScope_Global, 
         bus0, 
         &callbackStruct, 
         sizeof(callbackStruct); 
AudioOutputUnitStart(_effectState.rioUnit); 
+0

您的AudioUnit上的回調可能會在後臺線程中調用。只需在你的回調中設置一個斷點並檢查它正在運行的線程,你肯定會知道:) – Taum 2012-07-25 03:09:48