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