0

このループの問題が正確にはわかりませんが、実行するたびに 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

4 に答える 4

0

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

この時点で保持カウントは 0 であるため、配列はすぐに解放されます。

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

また、配列に追加する前に product が nil でないかどうかを確認することもできます。

そして、メモリリークがあります。

product = [[NSNumber alloc] init];

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

于 2011-01-21T08:49:34.627 に答える
0

これはタイプミスだと思いますが、ポインターを割り当てておらず、型でもなく、型を割り当てていませNSMutableArrayNSArray。行番号を確認してください。2:

NSMutableArray allValuesMArray = [[NSArray alloc] init];

そのはず

NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init];
于 2011-01-21T08:50:10.787 に答える
0

NSArray を作成し、それを NSMutableArray に割り当てていますか? おそらく、あなたは次のことを意味していました:

NSMutableArray* allValuesMArray = [[NSMutableArray alloc] init];
于 2011-01-21T08:50:26.950 に答える
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;

このコードで何か問題が発生した場合、 によって返される配列にNSNumber[ourDictionary objectForKey:toString]ではないインスタンスが少なくとも 1 つ含まれていることは間違いありません。NSException[scaleFactor doubleValue]

于 2011-01-24T12:35:17.767 に答える