Проблема с добавлением в NSMutableArray в цикле - PullRequest
0 голосов
/ 21 января 2011

Я не уверен, в чем проблема именно с этим циклом, но я продолжаю получать SIGABRT всякий раз, когда запускаю его. Согласно журналу проблема заключается в том, когда я пытаюсь добавить NSNumber в массив NSMutable в конце цикла. Очевидно, я сделал элементарную ошибку, но я не уверен, в чем проблема.

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;

Ответы [ 4 ]

0 голосов
/ 24 января 2011

Вот ваш код в очищенной, непротекающей форме:

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 - который вы узнаете по NSException, брошенному в [scaleFactor doubleValue].

0 голосов
/ 21 января 2011

Я уверен, что это опечатка, но вы не выделяете указатель и даже не тип NSMutableArray, а тип NSArray.Проверьте строку №.2:

NSMutableArray allValuesMArray = [[NSArray alloc] init];

Должно быть

NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init];
0 голосов
/ 21 января 2011

Вы создаете NSArray и присваиваете его NSMutableArray?Возможно, вы имели в виду следующее:

NSMutableArray* allValuesMArray = [[NSMutableArray alloc] init];
0 голосов
/ 21 января 2011

Вы выпускаете allValuesMArray: [allValuesMArray release];

Так как в этом месте количество сохранений равно 0, это немедленно освободит массив.

Попробуйте использовать [allValuesMArray autorelease]. Это освободит массив в будущем, предоставляя вызывающему методу возможность использовать невыпущенный массив или сохранить массив для дальнейшего использования.

Также вы можете проверить, не равен ли ноль product, прежде чем добавлять его в массив.

И у вас есть утечка памяти.

product = [[NSNumber alloc] init];

затем вы назначаете ему другой объект.

...