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 a void*
. Hal-hal seperti C-array dari id
dapat membutuhkan lebih banyak pemikiran untuk dilakukan dengan benar. Penanganan ObjC yang berlebihan va_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
file struct
. 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*
petunjuk id
(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()
.