2011-01-21 59 views
0

我不確定這個循環到底是什麼問題,但是我每次運行它時都會收到SIGABRT。根據日誌的問題是當我嘗試將NSNumber添加到循環結尾附近的NSMutable數組。很明顯,我犯了一個基本錯誤,但我不確定問題出在哪裏。在循環中添加到NSMutableArray中的問題

NSArray *toArray = [ourDictionary objectForKey:toString]; 
NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init]; 
while (done == NO) 
{ 
    if (i == 10) 
     done = YES; 
      /* 
      *The job here is to multiply these three numbers together and store the 
      *product in the mutable array. It tells me NSObject did not recognize selector 
      *and then crashes. 
      *original and multiplyFrom are always the same value, and multiplyTo is updated 
      *from an array I made above from a p-list. 
      *I'm hoping I didn't make a ton of rookie mistakes here, but I'm new to dealing with 
      *NSMutableArray and such. 
      */ 

    NSNumber *original = [NSNumber numberWithDouble:convertThis]; 
    NSNumber *multiplyFrom = [NSNumber numberWithDouble:multiply]; 
    NSNumber *multiplyTo = [NSNumber numberWithDouble:[[toArray objectAtIndex:i] doubleValue]]; 
    NSNumber *product = [[NSNumber alloc] init]; 

    product = [NSNumber numberWithDouble:([original doubleValue] * 
              [multiplyFrom doubleValue] * 
              [multiplyTo doubleValue])]; 

    [allValuesMArray addObject:product]; 
      //This line ^^^ causes crash 
    i++; 
} 
NSArray *returnThisArray = allValuesMArray; 
[allValuesMArray autorelease]; 
return returnThisArray; 
+0

你可以在這裏添加日誌歷史嗎? – Sarah 2011-01-21 07:54:03

+1

請顯示更多代碼,特別是`allValuesMArray`的創建。此外,刪除`[產品發佈]`,這將導致稍後崩潰。最後,BOOL類型的正確常量是`YES` /`NO`,而不是`TRUE` /`FALSE` – 2011-01-21 08:10:09

+0

我編輯了代碼以顯示更多的事情,如果它仍然不夠讓我知道你還需要看什麼。循環上面的所有東西都應該可以正常工作,我不確定獲得我想要的東西的最佳方法。這種方法的要點是從toArray讀取數字列表,計算產品,將每個產品存儲到一個新的數組中,然後將返回並寫入到一個p列表中。 – Justin 2011-01-21 08:38:38

回答

0

您正在發佈allValuesMArray:[allValuesMArray release];

由於此時保留計數爲0,因此會立即釋放數組。

嘗試使用[allValuesMArray autorelease]。這將在未來釋放該數組,使調用方法有機會使用未釋放的數組或保留該數組供以後使用。

另外,您可以在將產品添加到數組之前檢查產品是否爲零。

而且你有內存泄漏。

product = [[NSNumber alloc] init];

然後您稍後再爲其指定一個不同的對象。

0

我確定這是一個錯字,但您沒有分配指針,甚至沒有分配NSMutableArray類型,但是類型爲NSArray。檢查行號。 2:

NSMutableArray allValuesMArray = [[NSArray alloc] init]; 

應該

NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init]; 
0

你創建一個NSArray,並將其分配給一個NSMutableArray?也許你的意思如下:

NSMutableArray* allValuesMArray = [[NSMutableArray alloc] init]; 
0

下面是一個清理的代碼,不漏形式:

NSMutableArray *convertedValues = [NSMutableArray array]; 
// moved outside of the loop and descriptively named: 
double normalizedValue = convertThis * multiply; 
// make use of NSFastEnumeration -- better readability _and_ reliability 
for (NSNumber *scaleFactor in [ourDictionary objectForKey:toString]) 
{ 
    // just in case you want to add a breakpoint to see if everything works as expected: 
    double convertedValue = normalizedValue * [scaleFactor doubleValue]; 
    [convertedValues addObject:[NSNumber numberWithDouble:convertedValue]]; 
} 
return convertedValues; 

如果出現問題,此代碼,我敢打賭,該陣列由[ourDictionary objectForKey:toString]返回包含至少一個不是NSNumber的實例 - 您將通過在[scaleFactor doubleValue]處拋出NSException來識別此實例。