在循环中添加到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;
答
您正在发布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
来识别此实例。
你可以在这里添加日志历史吗? – Sarah 2011-01-21 07:54:03
请显示更多代码,特别是`allValuesMArray`的创建。此外,删除`[产品发布]`,这将导致稍后崩溃。最后,BOOL类型的正确常量是`YES` /`NO`,而不是`TRUE` /`FALSE` – 2011-01-21 08:10:09
我编辑了代码以显示更多的事情,如果它仍然不够让我知道你还需要看什么。循环上面的所有东西都应该可以正常工作,我不确定获得我想要的东西的最佳方法。这种方法的要点是从toArray读取数字列表,计算产品,将每个产品存储到一个新的数组中,然后将返回并写入到一个p列表中。 – Justin 2011-01-21 08:38:38