2011-01-21 4 views
0

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

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

+1

Пожалуйста, покажите больше кода, в частности, создание 'allValuesMArray'. Кроме того, удалите '[выпуск продукта]', который позже приведет к сбою. И, наконец, правильные константы для типа BOOL - 'YES' /' NO', а не 'TRUE' /' FALSE' –

+0

Я отредактировал код, чтобы показать больше о том, что происходит, если этого еще недостаточно дайте мне знать, что еще вам нужно увидеть. Все выше цикла должно работать нормально, я не уверен точно, как лучше всего получить то, что я хочу. Точка этого метода состоит в том, чтобы прочитать список чисел из toArray, вычислить продукт, сохранить каждый продукт в новый массив, который затем будет возвращен и записан в p-список. – Justin

ответ

0

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

Поскольку в этот момент количество удержаний равно 0, это немедленно освободит массив.

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

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

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

продукт = [[NSNumber alloc] init];

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

+0

У меня была автореферат, прежде чем я сделал ошибку, когда я ее копировал, моя проблема находится внутри цикла, в частности строка [allValuesMArray addObject: product]; – Justin

+0

Вы уверены, что продукт не ноль? Что такое двойное значение [original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue]? – martinws

+0

, который, кажется, работает, например, если я назначаю ([original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue]) до двойника, он дает мне ответ, но я боюсь, что по какой-то причине я не понимаю правильный способ добавления объектов в изменяемый массив ... – Justin

0

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

NSMutableArray allValuesMArray = [[NSArray alloc] init]; 

Это должно быть

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

да, это была опечатка! – Justin

+0

@Justin Тогда, пожалуйста, найдите время и исправьте его. Оба из них! – danyowdee

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