2010-01-27 20 views
25

Estoy trabajando a través de Cocoa sin problemas, pero este problema parece tan básico que cancela todas las cosas interesantes que aprendí. :/Convirtiendo ruta de archivo desde NSString a NSURL

Tengo una ruta de archivo generada, y necesita estar en formato NSURL. A partir de la investigación, este es el código que he escrito:

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

Y la salida:

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) 

En primer lugar, el alloc-init debería ni siquiera ser necesario; other people seem to get away with it. En este caso, si no configuro alloc, recibo un error de 'selector no reconocido' en esa línea. Por supuesto, ahora me estoy volviendo viejo (nulo).

¿Dónde lo hice?

Gracias!

Respuesta

34

El [[NSURL alloc] init] no es solo innecesario, es inválido. fileURLWithPath: es un método de clase, lo que significa que solo puede invocarlo en el objeto de clase (es decir, NSURL). No produce un error de compilación porque -(NSURL *)init devuelve un objeto de tipo id y no da como resultado un error de tiempo de ejecución porque -(NSURL *)init realmente devuelve nil, y los mensajes enviados a nil simplemente colocarán en cascada otro nil como valor de retorno.

Este código debería funcionar:

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

me encontré con su problema. -[NSOpenPanel URLs] devuelve una matriz de objetos NSURL, que trata como objetos NSString. Eso no está bien. Se debe utilizar la siguiente:

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

El depurador podría haber que muestran que si uno mira en la variable pathToFile. Asegúrate de revisarlo la próxima vez. :) Al pasar una variable con su mouse debería obtener su tipo.

Sin embargo, recuerde que hay situaciones en las que legítimamente encontrará otro tipo de lo que esperaba. Por ejemplo, la clase privada NSPathStore2 es parte del clúster NSString y puede hacer todo lo que NSString admite en objetos NSPathStore2. (Si esto sucede y no está seguro, consulte la documentación para ver si el tipo que espera es un tipo de clúster. Así es como se llaman en la documentación.)

+0

Ya veo. Gracias. ¿Qué método está disponible (si existe) para convertir la cadena que ahora tengo en lo que tienes? Los puntos de interrupción son realmente útiles, pero no hay mucho que pueda hacer con ellos en esta situación. Puedo entrar en fileURLWithPath:, pero si hay un error de tiempo de ejecución involucrado (como cuando no he usado alloc-init), lo mejor que puedo hacer es examinar el conjunto. – spamguy

+11

Todo lo que necesita hacer es esto: 'NSURL * xmlURL = [NSURL fileURLWithPath: pathToFile];' Si todavía tiene problemas, el problema podría ser con 'pathToFile'. Usa el depurador para averiguarlo. – Alex

+0

No, la cadena es definitivamente simple ol 'file: // localhost/Users/[username] /Music/iTunes/iTunes%20Music%20Library.xml. Fue generado usando NSOpenPanel ...pathToFile = [[oPanel URLs] objectAtIndex: 0]; – spamguy