Saya belum pernah menggunakan ARC, karena sebagian besar kode dalam proyek yang saya kerjakan saat ini ditulis sebelum iOS 5.0.
Saya hanya bertanya-tanya, apakah kenyamanan tidak menyimpan / melepaskan secara manual (dan mungkin kode yang lebih dapat diandalkan sebagai hasilnya?) Lebih besar daripada 'biaya' menggunakan ARC? Apa pengalaman Anda tentang ARC, dan apakah Anda akan merekomendasikannya?
Begitu:
- Berapa banyak manfaat yang dapat diberikan ARC untuk sebuah proyek?
- Apakah ARC memiliki biaya seperti pengumpulan sampah di Jawa?
- Apakah Anda pernah menggunakan ARC dan jika demikian, bagaimana Anda menemukannya sejauh ini?
iphone
objective-c
ipad
ios5
automatic-ref-counting
Simon Withington
sumber
sumber
Jawaban:
Tidak ada kerugian. Gunakan. Lakukan hari ini. Ini lebih cepat dari kode lama Anda. Ini lebih aman daripada kode lama Anda. Ini lebih mudah daripada kode lama Anda. Ini bukan pengumpulan sampah. Tidak memiliki overhead waktu proses GC. Kompilator menyisipkan retains dan release di semua tempat yang seharusnya Anda miliki. Tapi itu lebih pintar dari Anda dan dapat mengoptimalkan yang sebenarnya tidak diperlukan (seperti itu dapat membuka loop, menghilangkan variabel sementara, fungsi inline, dll.)
Oke, sekarang saya akan memberi tahu Anda tentang kerugian kecilnya:
Jika Anda adalah pengembang ObjC lama, Anda akan bergerak selama sekitar satu minggu ketika Anda melihat kode ARC. Anda akan segera mengatasi ini.
Ada beberapa (sangat) komplikasi kecil dalam menghubungkan ke kode Core Foundation. Ada sedikit lebih banyak komplikasi dalam menangani apa pun yang diperlakukan
id
sebagai avoid*
. Hal-hal seperti C-array dariid
dapat membutuhkan lebih banyak pemikiran untuk dilakukan dengan benar. Penanganan ObjC yang berlebihanva_args
juga dapat menyebabkan masalah. Kebanyakan hal yang melibatkan matematika pada penunjuk ObjC lebih rumit. Anda seharusnya tidak memiliki banyak hal seperti ini.Anda tidak dapat memasukkan
id
filestruct
. Ini cukup jarang, tetapi terkadang digunakan untuk mengemas data.Jika Anda tidak mengikuti penamaan KVC yang benar, dan Anda mencampurkan kode ARC dan non-ARC, Anda akan mengalami masalah memori. ARC menggunakan penamaan KVC untuk membuat keputusan tentang manajemen memori. Jika itu semua kode ARC, maka tidak masalah karena akan melakukan hal yang sama "salah" di kedua sisi. Tetapi jika itu campuran ARC / non-ARC maka ada ketidakcocokan.
ARC akan membocorkan memori selama pengecualian ObjC melempar. Pengecualian ObjC harus sangat dekat dengan penghentian program Anda. Jika Anda menangkap sejumlah besar pengecualian ObjC, Anda salah menggunakannya. Ini dapat diperbaiki menggunakan
-fobjc-arc-exceptions
, tetapi menimbulkan penalti yang dibahas di bawah ini:ARC tidak akan membocorkan memori selama pengecualian ObjC atau C ++ melontarkan kode ObjC ++, tetapi ini mengorbankan kinerja waktu dan ruang. Ini adalah satu lagi dalam daftar panjang alasan untuk meminimalkan penggunaan ObjC ++.
ARC tidak akan berfungsi sama sekali di iPhoneOS 3 atau Mac OS X 10.5 atau versi lebih lama. (Ini menghalangi saya untuk menggunakan ARC di banyak proyek.)
__weak
pointer tidak berfungsi dengan benar di iOS 4 atau Mac OS X 10.6, yang memalukan, tetapi cukup mudah untuk dikerjakan.__weak
pointer memang bagus, tapi itu bukan poin penjualan # 1 dari ARC.Untuk 95% + kode di luar sana, ARC brilian dan tidak ada alasan sama sekali untuk menghindarinya (asalkan Anda dapat menangani batasan versi OS). Untuk kode non-ARC, Anda dapat meneruskan
-fno-objc-arc
file demi file. Xcode sayangnya membuat ini jauh lebih sulit daripada yang seharusnya dilakukan dalam praktiknya. Anda mungkin harus memindahkan kode non-ARC ke xcodeproj terpisah untuk menyederhanakannya.Kesimpulannya, beralihlah ke ARC sesegera mungkin dan jangan pernah melihat ke belakang.
EDIT
Saya telah melihat beberapa komentar di sepanjang baris "menggunakan ARC bukanlah pengganti untuk mengetahui aturan manajemen memori Cocoa." Ini sebagian besar benar, tetapi penting untuk memahami mengapa dan mengapa tidak. Pertama, jika semua kode Anda menggunakan ARC, dan Anda melanggar Tiga Kata Ajaibdi semua tempat, Anda tetap tidak akan menemui masalah. Mengejutkan untuk dikatakan, tapi begitulah. ARC mungkin menyimpan beberapa hal yang Anda tidak bermaksud untuk menyimpannya, tetapi ARC akan merilisnya juga, jadi itu tidak masalah. Jika saya mengajar kelas baru di Cocoa hari ini, saya mungkin akan menghabiskan tidak lebih dari lima menit pada aturan manajemen memori yang sebenarnya, dan saya mungkin hanya menyebutkan aturan penamaan manajemen memori saat mendiskusikan penamaan KVC. Dengan ARC, saya yakin Anda bisa menjadi pemrogram pemula yang layak tanpa mempelajari aturan manajemen memori sama sekali.
Tetapi Anda tidak bisa menjadi programmer menengah yang layak. Anda perlu mengetahui aturan untuk menjembatani dengan benar dengan Core Foundation, dan setiap programmer perantara perlu berurusan dengan CF di beberapa titik. Dan Anda perlu mengetahui aturan untuk kode campuran-ARC / MRC. Dan Anda perlu mengetahui aturannya saat Anda mulai mengotak-atik
void*
petunjukid
(yang terus Anda perlukan untuk melakukan KVO dengan benar). Dan memblokir ... yah, manajemen memori blok itu aneh.Jadi maksud saya adalah bahwa manajemen memori yang mendasarinya masih penting, tetapi di mana saya biasanya menghabiskan waktu yang signifikan untuk menyatakan dan menyatakan kembali aturan untuk programmer baru, dengan ARC itu menjadi topik yang lebih maju. Saya lebih suka membuat pengembang baru berpikir dalam hal grafik objek daripada mengisi kepala mereka dengan panggilan yang mendasarinya
objc_retain()
.sumber
Lebih baik, jawaban yang lebih teknis akan datang, tapi begini:
sumber
Manfaatnya adalah tingkat perlindungan yang signifikan dari kesalahan umum dalam pengelolaan memori. Kebocoran yang disebabkan oleh kegagalan melepaskan objek dan crash karena gagal mempertahankan atau melepaskan objek sebelum waktunya harus dikurangi secara signifikan. Anda masih perlu memahami model memori terhitung referensi sehingga Anda dapat mengklasifikasikan referensi Anda sebagai kuat atau lemah, menghindari siklus penahanan, dan sebagainya.
Tidak ada pengumpulan sampah di iOS. ARC mirip dengan GC karena Anda tidak perlu menyimpan atau melepaskan objek secara manual. Ini tidak seperti GC karena tidak ada pengumpul sampah. Model penahan / rilis masih berlaku, hanya saja kompilator memasukkan panggilan manajemen memori yang sesuai ke dalam kode Anda untuk Anda pada waktu kompilasi.
Agak membingungkan jika Anda terbiasa menghitung referensi, tetapi itu hanya masalah membiasakan diri dan belajar untuk percaya bahwa kompilator benar-benar akan melakukan hal yang benar. Rasanya seperti kelanjutan dari perubahan pada properti yang disertakan dengan Objective-C 2.0, yang merupakan langkah besar lainnya untuk menyederhanakan manajemen memori. Tanpa panggilan manajemen memori manual, kode Anda menjadi sedikit lebih pendek dan lebih mudah dibaca.
Satu-satunya masalah dengan ARC adalah bahwa itu tidak didukung di versi iOS yang lebih lama, jadi Anda perlu mempertimbangkannya sebelum Anda memutuskan untuk mengadopsinya.
sumber
Menurut saya ARC adalah ide yang bagus. Dibandingkan dengan GC, Anda bisa mendapatkan kue dan memakannya juga. Saya cenderung percaya bahwa MRC menerapkan 'disiplin' yang tak ternilai terhadap manajemen memori yang akan diuntungkan oleh setiap orang. Tapi saya juga setuju bahwa masalah sebenarnya yang harus diperhatikan adalah Kepemilikan Objek dan Grafik Objek (seperti yang telah ditunjukkan banyak orang), dan bukan jumlah referensi tingkat rendah itu sendiri.
Kesimpulannya: ARC BUKANLAH izin untuk tidak memikirkan memori; ini adalah alat untuk membantu manusia menghindari tugas yang berulang, yang menyebabkan stres dan rentan terhadap kesalahan, oleh karena itu lebih baik didelegasikan ke mesin (kompiler, dalam hal ini).
Meskipun demikian, secara pribadi saya adalah pengrajin dan belum melakukan transisi. Saya baru saja mulai menggunakan Git ...
PEMBARUAN: Jadi saya memigrasi seluruh game saya, termasuk perpustakaan gl, dan sejauh ini tidak ada masalah (kecuali dengan asisten migrasi di Xcode 4.2). Jika Anda memulai proyek baru, lakukanlah.
sumber
Saya telah menggunakannya dalam beberapa proyek (yang memang kecil), dan saya hanya memiliki pengalaman yang baik, baik dari segi performa maupun keandalan.
Satu catatan kecil yang perlu diperhatikan adalah bahwa Anda perlu mempelajari referensi lemah yang boleh dan tidak boleh dilakukan: agar tidak menyebabkan loop referensi apa pun jika Anda mengkodekan UI Anda sendiri, perancang cenderung melakukannya dengan baik. otomatis jika Anda mengatur GUI Anda menggunakannya.
sumber
Satu-satunya downside yang saya temui adalah jika Anda menggunakan perpustakaan dengan banyak fungsi dan data CoreFoundation. Dalam MRC Anda tidak perlu khawatir tentang menggunakan
CFStringRef
bukan sebuahNSString*
. Di ARC, Anda harus menentukan bagaimana keduanya berinteraksi (jembatan dasar? Lepaskan objek CoreFoundation dan pindahkan ke ARC? Jadikan objek Cocoa sebagai objek yang dipertahankan CoreFoundation +1?) Selain itu, di OS X, ini hanya tersedia di 64- bit code (Meskipun saya memiliki header yang berfungsi untuk itu…).sumber