2011-01-21 7 views
0

このループで何が問題なのかよく分かりませんが、実行するたびにSIGABRTを取得し続けます。ログによると、ループの終わり近くでNSMutable配列にNSNumberを追加しようとすると問題が発生します。明らかに私は基本的なエラーを作りましたが、私はその問題が何であるか分かりません。問題ループ内の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

+1

詳細なコード、特に 'allValuesMArray'の作成を表示してください。また、 '[product release]'を削除すると、後でクラッシュする可能性があります。最後に、BOOL型の適切な定数は、 'TRUE' /' FALSE'ではなく、 'YES' /' NO'です。 –

+0

まだ十分ではない場合、何が起こっているのかをもっと表示するためにコードを編集しました他に何が必要なのか教えてください。ループの上のすべてがうまくいくはずですが、私が望むものを得るための最良の方法は正確ではありません。このメソッドのポイントは、toArrayから数値のリストを読み込み、製品を計算し、各製品を新しい配列に格納し、返されてpリストに書き込まれることです。 – Justin

答えて

0

allValuesMArray:[allValuesMArray release]をリリースしています。

この時点で保持カウントが0であるため、すぐにアレイが解放されます。

[allValuesMArray autorelease]を使用してみてください。これにより、未来の配列が解放され、呼び出されたメソッドが未リリースの配列を使用するか、または後で使用するために配列を保持する機会が与えられます。

また、アレイに追加する前に、製品がnilでないかどうかを確認することもできます。

メモリリークが発生しました。

= [[NSNumber alloc] init];

次に、別のオブジェクトに後で割り当てます。

+0

私はそれをコピーしている間に間違いを犯す前に私はautoreleaseを持っていました、私の問題はループ内、特にライン[allValuesMArray addObject:product]にあります。 – Justin

+0

あなたは製品がゼロではないと確信していますか? [元のdoubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue]のdouble値は何ですか? – martinws

+0

のように動作しているようです。例えば、([original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue])をdoubleに割り当てると、私には答えが出ますが、何らかの理由で私は理解していません変更可能な配列にオブジェクトを追加する適切な方法... – Justin

0

これはオススメですが、NSMutableArrayのタイプでなく、NSArrayのタイプでも、ポインタを割り当てているわけではありません。行番号を確認してください。 2:

NSMutableArray allValuesMArray = [[NSArray alloc] init]; 

それはあなたがNSArrayのを

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

はい、それはタイプミスでした! – Justin

+0

@Justinその後、時間をかけて修正してください。両方とも! – danyowdee

0

を作成していると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ではないインスタンスが少なくとも1つ含まれています。NSException[scaleFactor doubleValue]にスローされると認識します。

関連する問題