Mengonversi Jalur File Dari NSString Ke NSURL

Saya mengerjakan Kakao dengan lancar, tetapi masalah ini tampaknya begitu mendasar sehingga membatalkan semua hal keren yang saya pelajari. :/

Saya memiliki jalur file yang dibuat, dan itu harus dalam format NSURL. Dari penelitian, ini kode yang saya tulis:

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

Dan hasilnya:

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)

Pertama, alloc-init seharusnya tidak diperlukan; orang lain tampaknya lolos begitu saja. Dalam hal ini, jika saya tidak mengalokasikan init, saya mendapatkan kesalahan 'pemilih tidak dikenal' pada baris itu. Tentu saja, sekarang saya semakin tua (null).

Di mana saya melakukan kesalahan?

Terima kasih!


person spamguy    schedule 27.01.2010    source sumber


Jawaban (1)


[[NSURL alloc] init] bukan hanya tidak diperlukan, tetapi juga tidak valid. fileURLWithPath: adalah metode kelas, yang berarti Anda hanya dapat memanggilnya pada objek kelas (yaitu NSURL itu sendiri). Itu tidak menghasilkan kesalahan kompilasi karena -(NSURL *)init mengembalikan objek bertipe id, dan tidak menghasilkan kesalahan runtime karena -(NSURL *)init sebenarnya mengembalikan nil, dan pesan yang dikirim ke nil hanya akan mengalirkan nil lain sebagai nilai kembaliannya.

Kode ini seharusnya berfungsi:

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

Saya menemukan masalah Anda. -[NSOpenPanel URLs] mengembalikan array objek NSURL, yang Anda perlakukan sebagai objek NSString. Itu tidak benar. Anda harus menggunakan yang berikut ini:

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

Debugger dapat menunjukkan hal itu kepada Anda jika Anda melihat variabel pathToFile. Pastikan untuk memeriksanya lain kali. :) Melayangkan variabel dengan mouse Anda akan menghasilkan tipenya.

Namun, ingatlah bahwa ada situasi di mana Anda secara sah akan menemukan tipe lain selain yang Anda harapkan. Misalnya, kelas privat NSStore2 adalah bagian dari klaster NSString, dan Anda dapat melakukan semua yang didukung NSString pada objek NSStore2. (Jika ini terjadi dan Anda tidak terlalu yakin, periksa dokumentasi untuk melihat apakah tipe yang Anda harapkan adalah tipe cluster. Begitulah cara mereka dipanggil dalam dokumentasi.)

person zneak    schedule 27.01.2010
comment
Jadi begitu. Terima kasih. Metode apa yang tersedia (jika ada) untuk mengubah string yang saya miliki sekarang menjadi string yang Anda miliki? Breakpoint memang berguna, tapi tidak banyak yang bisa saya lakukan dengan breakpoint dalam situasi ini. Saya dapat masuk ke fileURLWithPath: , tetapi jika terjadi kesalahan runtime (seperti ketika saya tidak mengalokasikan init), hal terbaik yang dapat saya lakukan adalah memeriksa Majelis. - person spamguy; 28.01.2010
comment
Yang perlu Anda lakukan adalah ini: NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile]; Jika Anda masih mengalami masalah, masalahnya mungkin ada pada pathToFile. Gunakan debugger untuk mencari tahu. - person Alex; 28.01.2010
comment
Tidak, stringnya pastinya biasa saja file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml . Itu dihasilkan menggunakan NSOpenPanel...pathToFile = [[oPanel URLs] objectAtIndex:0]; - person spamguy; 28.01.2010
comment
Anda perlu menjalankan metode jalur di NSUrl untuk mendapatkan jalur file tanpa protokol file di depan. - person AshleyS; 28.11.2011