Цель-C [[NSXMLDocument alloc] initWithContentsOfURL: параметры URL: 0 ошибка: & ошибка]; помощь

Мне нужна небольшая помощь, у меня есть поле поиска и кнопка, которые запускают этот метод, но внизу я получаю сообщение об ошибке.

- (IBAction)fetchTracks:(id)sender {

NSString *input = [searchField stringValue];
NSString *searchString = [input stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"searchString: %@", searchString);

NSError *error;
NSString* libraryPath = [[NSString alloc] initWithString:@"~/Music/iTunes/iTunes Music Library.xml"];
NSURL *url = [NSURL URLWithString:libraryPath];

[doc release];
doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:&error];

NSLog(@"doc: %@", doc);

[itemNodes release];
itemNodes = [[doc nodesForXPath:@"ItemSearchResponse/Items/Item" error:&error] retain];

[tableView reloadData];
}

* -[NSXMLDocument initWithContentsOfURL:options:error:]: нулевой аргумент

Кто-нибудь может помочь, спасибо, Сами.


person Sami    schedule 14.02.2011    source источник
comment
Вы можете также опубликовать вывод консоли.   -  person Robin    schedule 14.02.2011
comment
Я изменил &error на NULL и использовал libraryPath = [libraryPath stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; похоже, это решило ошибку, но теперь в консоли я получаю doc: (null).   -  person Sami    schedule 14.02.2011


Ответы (3)


Вам нужно избегать пробелов в вашем коде. Например, вот так

  libraryPath = [libraryPath stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

Когда я добавляю это, ваш код не дает сбоев.
Но в целом я бы рекомендовал обращаться к файлам как к файлам (например, NSString stringWithContentsOfFile). Это сделает вашу жизнь проще.

Вы можете увидеть список символов, которые URL не может содержать здесь:

Небезопасно:

Персонажи могут быть небезопасными по ряду причин. Использование символа пробела небезопасно, так как значительные пробелы могут исчезнуть, а незначащие пробелы могут появиться при расшифровке URL-адресов, их наборе или обработке текстовыми программами.

person Nikita Rybak    schedule 14.02.2011

Измените эту строку:

NSError *error;

К этому:

NSError *error = nil;

Прочтите этот вопрос для получения дополнительной информации о том, почему это работает: NSError: Действительно ли использование nil для обнаружения ошибки отключает сообщение об ошибке?


Однако вас, похоже, вообще не волнует объект ошибки, поэтому вам лучше просто вызывать эти методы следующим образом (замените &error на NULL)

doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:NULL];
...
itemNodes = [[doc nodesForXPath:@"ItemSearchResponse/Items/Item" error:NULL] retain];
person theChrisKent    schedule 14.02.2011

Я думаю, вам может понадобиться:

NSString *urlString = [@"~/Music/iTunes/iTunes Music Library.xml" stringByExpandingTildeInPath];
NSString* libraryPath = [[NSString alloc] initWithString:urlString];
person Abizern    schedule 14.02.2011