Преобразование пути к файлу из NSString в NSURL - PullRequest
25 голосов
/ 28 января 2010

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

У меня есть сгенерированный путь к файлу, и он должен быть в формате 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 даже не должен быть необходим; другие люди, кажется, сходит с рук . В этом случае, если я не выделил init, я получаю ошибку «нераспознанный селектор» в этой строке. Конечно, теперь я просто старею (ноль).

Куда я пошёл?

Спасибо!

1 Ответ

34 голосов
/ 28 января 2010

[[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. (Если это происходит, и вы не уверены, проверьте документацию, чтобы узнать, является ли тип, который вы ожидаете, типом кластера. Именно так они и называются в документации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...