2016-11-03 21 views
2

私のコードでは、APIを解析するときに、__NSSingleObjectArrayIにはnilというエラーがありますが、配列には値があります。ここでiOSでJSON解析を実行するとNSSingleObjectArrayIエラーが発生しますか?

私は

latitudeArray = [monumentArray valueForKey:@"lat"]; 
     NSLog(@"latitudeArray is %@",latitudeArray); 
     longitudeArray = [monumentArray valueForKey:@"lng"]; 
     NSLog(@"longitudeArray is %@",longitudeArray); 

for (int i = 0; i<3; i++) { 

      CLLocation *locationA = [[CLLocation alloc] initWithLatitude:[latStr doubleValue] longitude:[longStr doubleValue]]; 
      CLLocation *locationB = [[CLLocation alloc] initWithLatitude:[[latitudeArray objectAtIndex:i] doubleValue] longitude:[[longitudeArray objectAtIndex:i] doubleValue]]; ----------> This Line I Got The Crash Error.. 

      CLLocationDistance distanceInMeters = [locationA distanceFromLocation:locationB]; 
      NSLog(@"distanceInMeters is %f",distanceInMeters); 
      float i = distanceInMeters/1000; 
      NSLog(@"distance between two places is %f KM", i); 

      //[locationDistances addObject:distanceInMeters]; 
     } 

NSSingleObjectArrayIの意味は何..ですコードの私の部分を与えましたか?

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

解決に手伝ってください。

latitudeArrayは値...

latitudeArray is (
    (
      (
        (
          (
       "27.000", 
       "27.1798189999", 
       "27.1928780000" 
      ) 
     ) 
    ) 
) 

+0

この配列をtableviewで使用しましたか? – KKRocks

+0

いいえ、私はAPIからの応答を受け取り、配列に格納されていません。@ KKRocks –

+0

何らかのコードを表示して、クラッシュの結果はどうですか? – dirtydanee

答えて

3

[latitudeArray objectAtIndex:i]または[longitudeArray objectAtIndex:i]は、あなたが特定のインデックスでそれにアクセスしようとする時には十分なアイテムを持っていない持っています。

クラッシュを回避するために、特定のインデックスのオブジェクトにアクセスする前に、配列がiの値より大きくない場合はカウントをチェックします。

for (int i = 0; i<3; i++) { 
     if ([latitudeArray count] > i && [longitudeArray count] > i) { 
      CLLocation *locationA = [[CLLocation alloc] initWithLatitude:[latStr doubleValue] longitude:[longStr doubleValue]]; 
      CLLocation *locationB = [[CLLocation alloc] initWithLatitude:[[latitudeArray objectAtIndex:i] doubleValue] longitude:[[longitudeArray objectAtIndex:i] doubleValue]]; 

      CLLocationDistance distanceInMeters = [locationA distanceFromLocation:locationB]; 
      NSLog(@"distanceInMeters is %f",distanceInMeters); 
      float i = distanceInMeters/1000; 
      NSLog(@"distance between two places is %f KM", i); 
     } 
    } 
+0

@ dirtydanee –

1

これを試してみてください:

if (latitudeArray.count == longitudeArray.count) { 
     for (int i = 0; i<latitudeArray.count; i++) { 

     } 
    } 
6

まず、いくつかの混乱を解消するために:NSSingleObjectArrayは、単一の要素を持つ配列のためにNSArrayだけの特殊なケースです。非常に多く発生し、その場合の特別な、より小さなオブジェクトを持つことは、スペースを節約します。 (シングルトンインスタンスを持つ空の配列のクラスさえあり、空の配列はすべて同じオブジェクトです!)。だからそれはNSArrayのふりをする。

例外は、存在しなかった配列要素にアクセスしようとしたことを明確に示しています。配列に要素が1つしかない場合、インデックス1の要素にアクセスしようとしました。そのため、インデックス0の要素にアクセスできました。

longitudeArrayには3つの要素があると予想されていますが、1つしかありません。 MonumentArrayは配列ではないので、配列で呼び出さないでください。

あなたはJSONを処理する、あなたは、受信したデータは、サーバーは、あなたが期待する正確に何を送信しない場合はそれ以外のアプリあらゆる場所にクラッシュしてしまう、あなたが期待したものであることを必見チェック。

関連する問題