berfungsi juga. Hal utama yang perlu diperhatikan adalah bahwa CoreFoundation akan sering mengembalikan objek dengan jumlah referensi +1, yang berarti mereka harus dilepaskan (semua CF [Type] Buat fungsi format melakukan ini).
Yang menyenangkan adalah di Cocoa Anda dapat menggunakan autorelease atau membebaskan dengan aman.
Namun, Xcode akan dengan senang hati memperingatkan Anda ketika Anda mencoba untuk membebaskan jembatan CFString ke NSString dan menawarkan untuk secara otomatis membungkusnya dalam CFBridgingRelease (), yang dapat Anda terima dan biarkan secara otomatis memasukkan pembungkus untuk Anda jika Anda mengklik opsi.
Sebenarnya, Anda tidak boleh menggunakan Cocoa retain, release, autorelease pada objek Core Foundation secara umum. Jika Anda menggunakan Garbage Collection (hanya di Mac OS X untuk saat ini), panggilan retensi, lepaskan, autorelease semuanya adalah no-op. Karenanya memori bocor.
Penting untuk menghargai asimetri antara Core Foundation dan Cocoa — di mana mempertahankan, melepaskan, dan autorelease adalah hal yang tidak mungkin. Jika, misalnya, Anda telah menyeimbangkan CFCreate ... dengan rilis atau autorelease, Anda akan membocorkan objek di lingkungan sampah yang dikumpulkan:
NSString*myString =(NSString*)CFStringCreate...(...);// do interesting things with myString...[myString release];// leaked in a garbage collected environment
Sebaliknya, menggunakan CFRelease untuk melepaskan objek yang sebelumnya Anda pertahankan menggunakan retain akan menghasilkan kesalahan jumlah referensi aliran bawah.
PS: Sepertinya tidak bisa mengomentari jawaban Peter Hosey - maaf karena menambahkan jawaban saya sendiri yang tidak perlu.
Saya akan menambahkan bahwa Anda tidak hanya dapat beralih dari CFString ke NSString hanya dengan tipe-cast, tetapi juga berfungsi sebaliknya. Anda dapat menjatuhkan CFStringCreateWithCStringpesan, yang merupakan satu hal lebih sedikit yang perlu Anda lepaskan nanti. (CF menggunakan Createtempat Cocoa menggunakannya alloc, jadi bagaimanapun, Anda harus melepaskannya.)
Saya mengalami masalah dengan ARC dan mempertahankan jumlah CFStrings. Menggunakan jawaban NilObjects dengan sedikit perubahan berhasil untuk saya. Saya baru saja menambahkan misalnya dipertahankan.
Jika Anda menggunakan ARC dalam versi terbaru dari Mac OS X / Objective C, itu nyata mudah:
Namun, Xcode akan dengan senang hati memperingatkan Anda ketika Anda mencoba untuk membebaskan jembatan CFString ke NSString dan menawarkan untuk secara otomatis membungkusnya dalam CFBridgingRelease (), yang dapat Anda terima dan biarkan secara otomatis memasukkan pembungkus untuk Anda jika Anda mengklik opsi.
sumber
(__bridge NSString *)
sudah cukup: tidak ada gunanya menambah retain countCFBridgingRelease()
.Mereka setara, jadi Anda bisa menggunakan CFStringRef:
Untuk info lebih lanjut, lihat Jenis-Jenis Jembatan Bebas Pulsa .
sumber
Sebenarnya, Anda tidak boleh menggunakan Cocoa retain, release, autorelease pada objek Core Foundation secara umum. Jika Anda menggunakan Garbage Collection (hanya di Mac OS X untuk saat ini), panggilan retensi, lepaskan, autorelease semuanya adalah no-op. Karenanya memori bocor.
Dari Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :
Penting untuk menghargai asimetri antara Core Foundation dan Cocoa — di mana mempertahankan, melepaskan, dan autorelease adalah hal yang tidak mungkin. Jika, misalnya, Anda telah menyeimbangkan CFCreate ... dengan rilis atau autorelease, Anda akan membocorkan objek di lingkungan sampah yang dikumpulkan:
Sebaliknya, menggunakan CFRelease untuk melepaskan objek yang sebelumnya Anda pertahankan menggunakan retain akan menghasilkan kesalahan jumlah referensi aliran bawah.
PS: Sepertinya tidak bisa mengomentari jawaban Peter Hosey - maaf karena menambahkan jawaban saya sendiri yang tidak perlu.
sumber
Saya akan menambahkan bahwa Anda tidak hanya dapat beralih dari CFString ke NSString hanya dengan tipe-cast, tetapi juga berfungsi sebaliknya. Anda dapat menjatuhkan
CFStringCreateWithCString
pesan, yang merupakan satu hal lebih sedikit yang perlu Anda lepaskan nanti. (CF menggunakanCreate
tempat Cocoa menggunakannyaalloc
, jadi bagaimanapun, Anda harus melepaskannya.)Kode yang dihasilkan:
sumber
Saya mengalami masalah dengan ARC dan mempertahankan jumlah CFStrings. Menggunakan jawaban NilObjects dengan sedikit perubahan berhasil untuk saya. Saya baru saja menambahkan misalnya dipertahankan.
sumber
Anda harus melemparkannya:
sumber
Anda dapat menggunakan: Dengan CFStringRef idc;
sumber