Ответ 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];
Забастовкa >
Я нашел вашу проблему.
-[NSOpenPanel URLs]
возвращает массив объектов NSURL, которые вы рассматриваете как объекты NSString. Это не так. Вы должны использовать следующее:
NSURL* url = [[oPanel URLs] objectAtIndex:0];
Отладчик мог бы показать вам, что если вы посмотрели на переменную pathToFile
. Обязательно проверьте его в следующий раз.:) Наведение переменной с помощью мыши должно получить ваш тип.
Однако помните, что есть ситуации, когда вы будете законно сталкиваться с другим типом, чем тот, который вы ожидали. Например, частный класс NSPathStore2 является частью кластера NSString, и вы можете делать все, что NSString поддерживает на объектах NSPathStore2. (Если это происходит, и вы не уверены, проверьте документацию, чтобы узнать, является ли тип, который вы ожидаете, типом кластера. Это как они вызваны в документации.)