Преобразование пути к файлу из NSString в NSURL

Я работаю с Cocoa плавно, но эта проблема кажется настолько простой, что сводит на нет все интересные вещи, которые я узнал. : /

У меня есть сгенерированный путь к файлу, и он должен быть в формате NSURL. Из исследований я написал следующий код:

NSLog(@"Old path = %@", pathToFile);
NSURL *xmlURL = [[[NSURL alloc] init] fileURLWithPath:pathToFile];
NSLog(@"New path = %@", [xmlURL absoluteString]);

И вывод:

2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] Old path = file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml
2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] New path = (null)

Во-первых, alloc-init даже не понадобится; другим людям это сходит с рук. В этом случае, если я не использую alloc-init, я получаю сообщение об ошибке «нераспознанный селектор» в этой строке. Конечно, сейчас я просто старею (ноль).

Где я дурак?

Спасибо!


person spamguy    schedule 27.01.2010    source источник


Ответы (1)


[[NSURL alloc] init] не просто не нужен, он недействителен. fileURLWithPath: - это метод класса, что означает, что вы можете вызывать его только для объекта класса (то есть самого NSURL). Он не вызывает ошибки компиляции, потому что -(NSURL *)init возвращает объект типа id, и не приводит к ошибке времени выполнения, потому что -(NSURL *)init фактически возвращает nil, а сообщения, отправленные на nil, будут просто каскадировать еще один nil в качестве возвращаемого значения.

Этот код должен работать:

NSString* pathToFile = @"/this/is/a/path";
NSURL* url = [NSURL fileURLWithPath:pathToFile];

Я обнаружил вашу проблему. -[NSOpenPanel URLs] возвращает массив объектов NSURL, которые вы рассматриваете как объекты NSString. Это не правильно. Вам следует использовать следующее:

NSURL* url = [[oPanel URLs] objectAtIndex:0];

Отладчик мог бы показать вам это, если бы вы посмотрели на переменную pathToFile. Обязательно проверьте это в следующий раз. :) При наведении курсора мыши на переменную вы должны узнать ее тип.

Однако помните, что бывают ситуации, когда вы законно столкнетесь с другим типом, чем тот, который вы ожидали. Например, частный класс NSPathStore2 является частью кластера NSString, и вы можете делать все, что поддерживает NSString, с объектами NSPathStore2. (Если это произойдет, и вы не слишком уверены, проверьте документацию, чтобы узнать, является ли ожидаемый тип типом кластера. Именно так они называются в документации.)

person zneak    schedule 27.01.2010
comment
Я понимаю. Спасибо. Какой метод доступен (если есть), чтобы превратить имеющуюся у меня строку в то, что есть у вас? Точки останова действительно полезны, но в этой ситуации я мало что могу с ними сделать. Я могу войти в fileURLWithPath :, но если возникла ошибка времени выполнения (например, когда я не использовал alloc-init), лучшее, что я могу сделать, - это изучить сборку. - person spamguy; 28.01.2010
comment
Все, что вам нужно сделать, это: NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile]; Если у вас все еще есть проблемы, проблема может быть в pathToFile. Используйте отладчик, чтобы узнать. - person Alex; 28.01.2010
comment
Нет, это определенно обычная строка ol 'file: // localhost / Users / [имя пользователя] /Music/iTunes/iTunes%20Music%20Library.xml. Он был создан с использованием NSOpenPanel ... pathToFile = [[URL-адреса oPanel] objectAtIndex: 0]; - person spamguy; 28.01.2010
comment
Вам нужно вызвать метод пути в NSUrl, чтобы получить путь к файлу без файлового протокола впереди. - person AshleyS; 28.11.2011