Jika saya memutuskan untuk meningkatkan ke iOS 5, apakah saya perlu menghapus semua pernyataan [myObject mempertahankan] dan [rilis myObject] dari kode saya?
Ya, tetapi XCode 4.2 menyertakan alat "Migrate to Objective-C ARC" baru (di menu Edit-> Refactor), yang melakukannya untuk Anda. Menyebut dealloc adalah cerita yang berbeda. Seperti yang disebutkan dalam komentar, referensi clang menyatakan bahwa Anda harus tetap menggunakan metode dealloc:
Rasional: meskipun ARC menghancurkan variabel instance secara otomatis, masih ada alasan yang sah untuk menulis metode dealloc, seperti membebaskan sumber daya yang tidak dapat dipertahankan. Gagal memanggil [super dealloc] dengan metode seperti itu hampir selalu merupakan bug.
Anda mengaktifkan ARC menggunakan flag compiler -fobjc-arc baru. ARC didukung di Xcode 4.2 untuk Mac OS X v10.6 dan v10.7 (aplikasi 64-bit) dan untuk iOS 4 dan iOS 5. (Referensi yang lemah tidak didukung di Mac OS X v10.6 dan iOS 4). Tidak ada dukungan ARC di Xcode 4.1.
-
Jika saya mengembangkan aplikasi baru untuk iOS 5 menggunakan ARC, apakah saya perlu menerapkan semacam pemeriksaan "kompatibilitas retro"? Yaitu: apakah saya perlu memeriksa versi iOS dan memanggil mempertahankan dan merilis yang sesuai? Jadi, pada dasarnya, apakah ARC tersedia untuk semua versi iOS atau hanya untuk iOS 5?
Tidak, karena ARC melakukan keajaibannya pada waktu kompilasi dan bukan pada waktu berjalan.
Alih-alih Anda harus mengingat kapan harus menggunakan retensi, rilis, dan rilis otomatis, ARC mengevaluasi persyaratan umur objek Anda dan secara otomatis memasukkan panggilan metode yang sesuai untuk Anda pada waktu kompilasi. Kompilator juga menghasilkan metode dealloc yang sesuai untuk Anda.
Informasi Lebih Lanjut tentang ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html
dealloc
, Anda hanya menghapus semuarelease
s Anda dan[super dealloc]
darinya. Dan 99,9%dealloc
hanya melepaskan objek, jadi Anda menghapusnya. Tetapi objek masih harus melakukan tugas pembersihan lain yang tidakrelease
(menutup file, menghapus pengamat, dll.).T1: TIDAK, Jika Anda memiliki kode yang sudah ada, Anda dapat tetap menggunakannya seperti pada -fno-objc-arc, Anda dapat menonaktifkan ARC secara selektif pada file apa pun.
Jika Anda ingin ARC menonaktifkan pada GANDA file:
T2: TIDAK, target bisa serendah iOS 4.0
sumber
Sejauh yang saya mengerti dan sejauh iPhone / iPod saya menjalankan iOS 5 dan iOS 4.3 masing-masing berfungsi, semuanya cukup otomatis. Sebuah aplikasi yang saya mulai untuk 4.0 dan telah "diperbarui" untuk bekerja dengan Xcode untuk iOS 5.0 tidak pernah memberikan peringatan apa pun tentang cara saya melepaskan dan mempertahankan, meskipun semuanya ada di setiap dealloc, dll. Namun, beberapa kode yang sama saya masukkan (menyalin file) ke dalam proyek baru yang dibuat dengan Xcode untuk iOS 5 memiliki banyak, banyak peringatan. Jadi tampaknya Anda tidak perlu menghapus semua panggilan itu, dan tidak, entah bagaimana itu menyesuaikannya secara otomatis untuk versi yang lebih lama. Membuat profil iPod saya, saya tidak melihat kebocoran memori atau tanda-tanda gagal deallocs / melepaskan. Apakah ini membantu?
sumber
Mengenai bagian pertanyaan Anda ini
Perlu dicatat bahwa pengompilasi iOS 5 menggunakan "kompatibilitas-retro" (itu sebenarnya MENAMBAHKAN kode untuk membuat penyimpanan / rilis berfungsi, pada dasarnya), tetapi jika Anda tidak mengkompilasi untuk iOS 5.0, Anda tidak dapat menggunakan
weak
sebagai kata kunci . Sebagai gantinya Anda gunakanassign
. Ini sangat disayangkan:weak
adalah keuntungan besar (tidak ada petunjuk yang menggantung, selamanya!). Lihat pertanyaan saya di sini untuk diskusi tentangweak
,assign
dan ARC.sumber
Jika Anda dapat menonaktifkan ARC dengan tidak menggunakan flag compiler -fobjc-arc baru, maka Anda tidak akan dipaksa untuk menulis ulang kode selanjutnya - saya kira (?)
sumber