Подтвердить что ты не робот

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

Где я попал?

Спасибо!

4b9b3361

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