3

iPhoneでこのエラーが発生する場合、この問題が発生します。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteData initWithContentsOfURL:options:error:]: nil URL argument'

いくつかのXMLデータを解析しようとしています。シミュレーターでこれを試してみるとエラーは発生しませんが、iOSデバイスで試してみると、コンソールでエラーが発生します。

これは、XMLを解析するための私のコードです。

- (ICB_WeatherConditions *)initWithQuery:(NSString *)query {

if (self = [super init])
{
    CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", query]] options:0 error:nil] autorelease];

    condition         = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/condition" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];        
    location          = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
    day2c    = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/condition" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
    day3c     = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/condition" error:nil] objectAtIndex:1] attributeForName:@"data"] stringValue] retain];

    currentTemp       = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/temp_f" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
    lowTemp           = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions[2]/low" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
    highTemp          = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/high" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];

    conditionImageURL = [[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com%@", [[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/icon" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue]]] retain];
}

return self;}

これは、クエリを送信するための私のコードです。

- (void)showWeatherFor:(NSString *)query {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

ICB_WeatherConditions *weather = [[ICB_WeatherConditions alloc] initWithQuery:query];

self.conditionsImage = [[UIImage imageWithData:[NSData dataWithContentsOfURL:weather.conditionImageURL]] retain];

[self performSelectorOnMainThread:@selector(updateUI:) withObject:weather waitUntilDone:NO];


[pool release];}

私を正しい方向に向けるのを手伝ってください!再度、感謝します!

4

2 に答える 2

2

ifはじめに:ステートメントの最初の行にエラーが表示されます。これにより文字列とURLが作成され、例外は「nilURL引数」です。したがって、このラインをいくつかの部分に分割します。

NSString *queryPath = [NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", query];
NSURL *queryURL = [NSURL URLWithString:queryPath];
CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:queryURL options:0 error:nil] autorelease];

次に、すべてqueryをテストするコードを挿入し、値が期待どおりでない場合はエラーを生成します。問題が明らかになるはずです。queryPathqueryURL

于 2012-06-09T04:30:21.203 に答える
2

私はそれを考え出した!

話と解決策は次のとおりです。私は天気予報アプリを作成していましたが、データを含む有効な XML ファイルを取得するためにクエリに都市が必要でした。私のシミュレーターでは、場所がかなりずれていたので、カリフォルニア州グレンデールになりました?! ご覧のとおり、 Glendale は ONE WORDです。したがって、これがクエリに入ると、有効な URL として渡され、データが取得されました。電話でテストしたところ、上記のエラーが表示されました。これは、私が住んでいる場所では、CLGeocoder の reverseGeocodeLocation から取得した都市名が 2 語だったためです。(つまり、デモイン)。真ん中のスペースがすべてを台無しにしました。明らかに、URL にスペースを入れてもデータは返されません。私が使用していた「XMLスピッティングサービス」でスペースを取得するには、+記号を使用する必要がありました. それで、約4時間のデバッグの後、私はこれを見つけて、これを入れました:

 stringByReplacingOccurrencesOfString:@" " withString:@"+"

私の方法の最後に、最終的には次のようになりました:

 City = [[placemark locality] stringByReplacingOccurrencesOfString:@" " withString:@"+"];

これで解決し、スペースをプラス記号に置き換えることができるようになったため、実際のデータが返されました! 同様の問題を抱えている人に幸運を!

于 2012-06-09T04:50:19.160 に答える