Beberapa pertanyaan tentang Penghitungan Referensi Otomatis di iOS5 SDK

134

Saya sedang mengembangkan aplikasi untuk iPad. Pengembangan dimulai untuk iOS 4.2 dan sekarang berlanjut (dan saya pikir akan selesai) untuk iOS 4.3. Saya baru saja membaca tentang ARC di iOS 5, dan pada dasarnya saya mengerti bahwa kita tidak perlu lagi melepaskan dan menyimpan objek. Pertanyaan saya adalah:

  1. Jika saya memutuskan untuk meningkatkan ke iOS 5, apakah saya perlu menghapus semua [myObject retain]dan [myObject release]pernyataan dari kode saya?

  2. 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 dan melepaskan sesuai? Jadi, pada dasarnya, apakah ARC tersedia untuk semua versi iOS atau hanya untuk iOS 5?

Lukas47
sumber

Jawaban:

150

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

Henrik P. Hessel
sumber
Terima kasih atas penjelasan Anda!
Luke47
4
Ini tidak 100% benar. Ada sakelar kompiler yang menentukan apakah ARC diaktifkan atau tidak. Juga ARC membutuhkan beberapa dukungan runtime, saya percaya, jadi jika Anda ingin aplikasi Anda bekerja di iOS 4.x Anda harus meninggalkan retains dan rilis Anda dan memastikan ARC dimatikan.
JeremyP
8
@JeremyP - iOS 4.0 memang didukung sebagai target untuk aplikasi ARC, jadi tidak perlu menyimpan kode penghitungan referensi manual untuk menangani platform lama tersebut. iPhone OS 3.x mungkin, tapi saya membayangkan Apple mungkin menghentikan dukungan untuk itu sebagai platform target setelah 5.0 dikirimkan, seperti yang mereka lakukan untuk 2.x saat 4.0 keluar.
Brad Larson
5
@Brad Basis penginstalan untuk iOS4 sudah lebih dari 95%. Saya pikir itu aman untuk menjatuhkan dukungan iOS3.
Henrik P. Hessel
2
Anda tidak menghapus dealloc, Anda hanya menghapus semua releases Anda dan [super dealloc]darinya. Dan 99,9% deallochanya melepaskan objek, jadi Anda menghapusnya. Tetapi objek masih harus melakukan tugas pembersihan lain yang tidak release(menutup file, menghapus pengamat, dll.).
Stanislav Yaglo
8

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:

  1. Pilih file yang diinginkan di Target / Build Phases / Compile Sources di Xcode
  2. PRESS ENTER . (klik dua kali hanya memilih satu file)
  3. Ketik -fno-objc-arc
  4. Tekan Enter atau Selesai

T2: TIDAK, target bisa serendah iOS 4.0

Tibidabo
sumber
7

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?

Dylan Gattey
sumber
Versi beta terbaru sebenarnya meminta saya untuk menghapus semua panggilan alokasi, dan hanya itu. Anda masih dapat mempertahankan / melepaskan tetapi sistem memiliki kata terakhir.
Dylan Gattey
5

Mengenai bagian pertanyaan Anda ini

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?

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 weaksebagai kata kunci . Sebagai gantinya Anda gunakan assign. Ini sangat disayangkan: weakadalah keuntungan besar (tidak ada petunjuk yang menggantung, selamanya!). Lihat pertanyaan saya di sini untuk diskusi tentang weak, assigndan ARC.

Dan Rosenstark
sumber
2

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 (?)

Oliver
sumber