在循环中添加到NSMutableArray中的问题

问题描述:

我不确定这个循环到底是什么问题,但是我每次运行它时都会收到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

您正在发布allValuesMArray:[allValuesMArray release];

由于此时保留计数为0,因此会立即释放数组。

尝试使用[allValuesMArray autorelease]。这将在未来释放该数组,使调用方法有机会使用未释放的数组或保留该数组供以后使用。

另外,您可以在将产品添加到数组之前检查产品是否为零。

而且你有内存泄漏。

product = [[NSNumber alloc] init];

然后您稍后再为其指定一个不同的对象。

我确定这是一个错字,但您没有分配指针,甚至没有分配NSMutableArray类型,但是类型为NSArray。检查行号。 2:

NSMutableArray allValuesMArray = [[NSArray alloc] init]; 

应该

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

你创建一个NSArray,并将其分配给一个NSMutableArray?也许你的意思如下:

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

下面是一个清理的代码,不漏形式:

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来识别此实例。