Praktik Terbaik iOS 5 (Lepaskan / simpan?)

109

Sebagai pemrogram iPhone pemula, apa praktik terbaik untuk menulis aplikasi yang akan digunakan dengan iOS 5 atau versi yang lebih lama? Secara khusus, apakah saya harus terus menggunakan rilis / penyimpanan data, atau haruskah saya mengabaikannya? Apakah itu penting?

Geekgirl
sumber
1
Gunakan ARC, dan ikuti praktik terbaik seperti yang diuraikan di sini: amattn.com/2011/12/07/arc_best_practices.html Jika Anda melakukannya, Anda akan menemukan bahwa ARC "langsung berfungsi". Jika Anda tidak mengikuti praktik tersebut, Anda akan berakhir dengan kebocoran dan menghabiskan banyak waktu untuk melacaknya ....
n13

Jawaban:

98

Terserah kamu. Anda dapat menulis aplikasi menggunakan ARC (Penghitungan Referensi Otomatis), dan Xcode akan menulis "kode perekat" untuk memungkinkan aplikasi Anda yang mendukung ARC berjalan di iOS 4, tidak perlu modifikasi. Namun, hal-hal tertentu tidak akan berfungsi, dan yang paling mencolok banyak pustaka yang mungkin ingin Anda gunakan akan (kadang-kadang) memunculkan kesalahan yang tak terhitung banyaknya dan Anda tidak akan dapat menggunakannya sampai pengembang merilis pembaruan yang kompatibel dengan ARC.


Sunting : Baru-baru ini saya menemukan bahwa Anda dapat mematikan ARC untuk setiap file. Lihat jawaban pixelfreak . Jadi, saran saya masih berlaku, tetapi sekarang pustaka pihak ketiga tidak perlu diperbarui untuk bekerja dengan ARC.

Inilah yang dikatakan Apple tentang memilih keluar dari ARC untuk file tertentu:

Saat Anda memigrasi project untuk menggunakan ARC, flag compiler -fobjc-arc disetel sebagai default untuk semua file sumber Objective-C. Anda dapat menonaktifkan ARC untuk kelas tertentu menggunakan tanda kompilator -fno-objc-arc untuk kelas itu. Di Xcode, di tab Target Build Phases, buka grup Compile Sources untuk menampilkan daftar file sumber. Klik dua kali file yang ingin Anda setel benderanya, masukkan -fno-objc-arc di panel pop-up, lalu klik Selesai.

masukkan deskripsi gambar di sini

Lihat panduan transisi lengkap di sini .

sudo rm -rf
sumber
15
ARC jelas dapat dimatikan pada basis "per file", mungkin mengizinkan penggunaan pustaka lama ... Tapi saya belum bermain dengannya jadi saya belum tahu. Saya sangat bersemangat tentang itu. Dapatkah Anda membayangkan dunia di mana pengembang iOS tidak perlu berkeringat untuk mempertahankan / melepaskan ?? Apa yang akan kita bicarakan di sini di SO ?? ;-)
Dan Ray
45
Tepat ketika saya akhirnya bisa menangani semua omong kosong manajemen memori itu, dan kemudian mereka membuatnya tidak relevan. PEKERJAAN !!!
Kongress
@Dan: Anda tidak bercanda itu bisa dimatikan secara selektif? Tolong beri tautan, itu penting bagi saya! : D
sudo rm -rf
1
Saya percaya kompiler tidak berada di bawah NDA sekarang jadi untuk secara selektif mengecualikan beberapa file (biasanya folder sumber pihak ketiga) dari kode Anda, cukup tambahkan ini sebagai opsi kompiler untuk setiap file: -fno-objc-arc
blackjack75
2
@Yar: Ya, Anda. Saya berharap sesederhana itu, tetapi sayangnya tidak semua perpustakaan sesederhana itu. Ambil JSONKitcontoh. Coba jalankan melalui pemeriksaan ARC. Anda akan melihat apa yang saya maksud. ;)
sudo rm -rf
170

Bagi siapa pun yang masih penasaran tentang cara mematikan ARC pada file individual, inilah yang saya lakukan:

  1. Buka pengaturan proyek Anda, di bawah Build Phases > Compile Sources
  2. Pilih file yang ingin Anda nonaktifkan ARC dan tambahkan flag compiler -fno-objc-arc . Anda dapat mengatur bendera untuk beberapa file sekaligus dengan memilih file lalu menekan tombol "Enter".

Saya tidak tahu apakah ini cara yang disarankan, tetapi berhasil untuk saya.

PS: Saya mengumpulkan informasi ini dari clang.llvm.org di sini yang dapat diakses publik, jadi bukan di bawah NDA.

pixelfreak
sumber
1
Ketika saya menggunakan flag ini dengan library, itu berfungsi, tetapi segera setelah saya menyertakan file lib .h ke dalam kelas ARC, Xcode mengeluh seolah-olah saya tidak memiliki flag di sana. Apakah Anda bisa mendapatkan perpustakaan lama untuk bekerja dengan bendera ini?
casey
Saya bisa mendapatkan ASIHttpRequest dan SBJson bekerja (saya mendapat 1 peringatan tentang penggunaan struct di Reachability.h). Saya menempatkan bendera di semua file implementasinya.
pixelfreak
Semua file implementasi atau hanya .h? Di bagian Sumber Kompilasi saya dari proyek itu hanya memiliki file header, tidak ada file implementasi. Saya dapat menambahkannya, tetapi tampaknya tidak memiliki efek yang berbeda. Untuk referensi Anda, saya mencoba membuat parser REST berfungsi. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey
1
Aha! Saya tidak melihat cukup dekat pada kesalahan. Mereka adalah kesalahan yang berbeda dibandingkan tanpa bendera. Saya hanya harus menghapus kumpulan rilis otomatis dari kode dan wha-la!
casey
Ketika saya memilih beberapa file dan menekan enter, seperti yang disarankan di sini, semuanya dihapus dari 'Sumber kompilasi' dalam fase Build. Saya harus memilihnya satu per satu. Tidak yakin apakah saya melakukan kesalahan.
Gopalakrishnan Subramanian
10

iOS 5 masih di bawah NDA, dan mungkin akan sampai mereka merilis versi publik. Jika Anda memiliki akun pengembang, kunjungi Forum Pengembang Apple dan tanyakan di sana.

Untuk versi sebelumnya, Anda harus menghitung referensi dan mempertahankan serta merilisnya. Lihat panduan Manajemen Memori .

Sunting: Berikut spesifikasi publik untuk Penghitungan Referensi Otomatis dan kutipan dari halaman publik iOS 5 :

Penghitungan Referensi Otomatis (ARC) untuk Objective-C menjadikan manajemen memori sebagai tugas compiler. Dengan mengaktifkan ARC dengan kompiler LLVM Apple yang baru, Anda tidak perlu lagi mengetik mempertahankan atau melepaskan, yang secara dramatis menyederhanakan proses pengembangan, sekaligus mengurangi kerusakan dan kebocoran memori. Kompilator memiliki pemahaman lengkap tentang objek Anda, dan melepaskan setiap objek saat tidak lagi digunakan, sehingga aplikasi berjalan secepat sebelumnya, dengan kinerja yang mulus dan dapat diprediksi.

raja nevan
sumber
Akankah aplikasi yang dikembangkan menggunakan iOS 5 berfungsi dengan iPhone lama?
Geekgirl
Anda akan dapat menggunakan alat untuk mengembangkan OS yang lebih lama, tetapi Anda tidak akan dapat menggunakan teknologi baru seperti ARC. Jika Anda ingin menargetkan OS lama, Anda harus melakukan manajemen memori manual. Jika Anda ingin menggunakan ARC, Anda harus membatasi pengguna ke iOS 5.
raja nevan
1
Referensi ke ARC ada di halaman publik Apple developer.apple.com/technologies/ios5 jadi setidaknya beberapa bagian tidak di bawah NDA.
cobbal
8
Sebenarnya itu tidak sepenuhnya benar. Anda dapat membangun untuk iOS 4 dengan ARC. Kutipan dari insinyur Apple: " Untuk iOS 4 dan Mac OS 10.6, compiler menambahkan sedikit kode perekat kompatibilitas waktu proses ke aplikasi Anda. Ini berfungsi untuk semua hal kecuali variabel __weak, yang membutuhkan lebih banyak dukungan daripada yang dapat diberikan kode kompatibilitas. ARC di iOS 4 lebih sederhana daripada kode non-ARC, tetapi tidak sesederhana ARC di iOS 5. "Ngomong-ngomong, aplikasi jadwal WWDC ditulis dengan ARC dan berfungsi dengan baik di iOS 4!
sudo rm -rf
3
Ya; Namun itu memenuhi syarat pada pembicaraan ARC karena hanya target 4.3.x yang mendapatkan 'lem kompatibilitas'.
Alan Zeino
4

Detailnya ringan / di bawah NDA saat ini, tetapi Apple telah menerapkan Penghitungan Referensi Otomatis (ARC) di iOS 5, seperti yang dijelaskan di sini: http://developer.apple.com/technologies/ios5/

Jika Anda mengembangkan aplikasi baru di Xcode 4 dengan iOS 5 SDK, Anda dapat dengan aman mengabaikan penghitungan retensi / rilis.

[edit] sudo rm -rf membuat poin yang bagus; lib pihak ketiga mungkin terpengaruh secara signifikan

Dominic
sumber
Akankah aplikasi yang dikembangkan menggunakan iOS 5 berfungsi dengan iPhone lama?
Geekgirl
Ini akan bekerja pada iPhone yang menjalankan iOS 5, jadi hanya iPhone 3GS atau iPhone 4. Saya tidak percaya ini akan mendukung iOS 4, tapi sekali lagi, ini dilakukan oleh LLVM saat kompilasi, jadi mungkin saja untuk menghasilkan biner untuk iOS 4 dan 5. Saya sangat menyarankan untuk mendapatkan akun Pengembang iOS dan bermain-main dengan opsi yang tersedia.
Dominic
Seperti yang ditunjukkan sudo dalam komentarnya tentang jawaban nevan, Anda memang dapat menargetkan kembali ke iOS 4.0 dengan ARC, jadi perangkat lama yang dapat menjalankan OS tersebut kompatibel dengan ini.
Brad Larson
3

Tidak ada yang menyebutkan SystemConfiguration.framework ? Harap jangan lupa untuk memasukkannya ke dalam Frameworks . Dengan sedih saya menghabiskan beberapa jam untuk menyadarinya.

ThinkChris
sumber
Anda harus menjelaskan alasannya.
John Riselvato
3

Ini tentu menjadi pilihan developer atau tim. ARC (Penghitung Referensi Otomatis) telah membuat segalanya menjadi sedikit lebih mudah dengan mengelola memori secara otomatis untuk Anda. Ini akan melepaskan, menahan, dan membatalkan alokasi jika sesuai. Saya percaya bahwa Anda harus mendapatkan pengalaman mengelola memori sendiri lebih disukai dalam aplikasi pengujian, jika Anda belum melakukannya. Hal lain yang perlu dipertimbangkan adalah apakah aplikasi Anda bergantung pada pustaka pihak ketiga, yang jika tidak dikonversi ke ARC akan mencegah aplikasi Anda untuk dikompilasi. Pilihannya jelas tergantung pada situasi yang dihadapi.

Charles
sumber
0

setel flag sebagai -fno-objc-arc dalam pengaturan proyek> Fase Build> Compile Sources

Mubin Shaikh
sumber