0

私は NSArray (RSIatAddr) を持っており、指定されたインデックス = 0 (または他の任意の定数) にあるオブジェクトを確認したいのですが、次のコードでは警告やエラーは発生しません。しかし、例外をスローしています

if ([[RSIatAddr objectAtIndex:j] isEqualToNumber:nil]) {
    [sumRSI addObject:[NSNumber numberWithInt:[[RSIatAddr objectAtIndex:j]intValue]*
    [[sumRSI objectAtIndex:j] intValue]]]; }

私が得ているエラー:

2012-10-02 00:42:00.266 NetSearch+DetectLocation[3741:707] 
*** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[__NSCFNumber compare:]: nil argument'
4

2 に答える 2

3

isEqualToNumber:NSNumber渡す整数ではなく、を引数として取ります。

使用している整数 は0たまたま の値ですnilが、整数が の有効なポインタ値になる可能性は非常に低いためNSNumber、クラッシュすることもあります。

于 2012-10-01T17:37:29.553 に答える
1

実際に配列を埋めるコードが表示されない場合、配列が予想とは異なる型を保持している可能性があります。そのコード行の直前にブレークポイントを設定し、「po [[RSIatAddr objectAtIndex:j] class]」と入力して、実際にそこにあるものを確認してから、デバッグ ウィンドウで isEqualToNumber を試して、それが成功するかどうかを確認することもできます。

これを新しい iOS アプリの AppDelegate に実装したところ、次のように動作します。

NSArray *array = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:1], nil];
NSLog(@"%@", array);

for (NSNumber *num in array) {
    if ([num isEqualToNumber:[NSNumber numberWithInt:0]]) {
        NSLog(@"Equal");
    } else {
        NSLog(@"Not Equal");
    }
}
于 2012-10-01T17:37:15.860 に答える