Nonaktifkan Penghitungan Referensi Otomatis untuk Beberapa File

183

Saya telah mengunduh iOS 5 SDK dan menemukan bahwa ARC adalah fitur hebat dari kompiler Apple baru. Untuk saat ini, banyak kerangka kerja pihak ketiga tidak mendukung ARC. Bisakah saya menggunakan ARC untuk kode baru saya dan menjaga kode tetap / rilis saat ini tidak berubah? Konverter ARC tidak berfungsi di sini, karena beberapa kerangka kerja, seperti JSONKit, tidak dapat dikonversi ke ARC dengan menggunakan konverter.

Edit:

Jawabannya adalah menambahkan -fno-objc-arcke flag kompiler untuk file yang tidak Anda inginkan ARC. Dalam Xcode 4, Anda dapat melakukan ini di bawah target Anda -> Bangun Fase -> Kompilasi Sumber.

tidak menarik
sumber
2
Untuk memperjelas, Anda cukup menambahkannya ke .mfile. Bukan .hfile.
ma11hew28
Saya menemukan percakapan ini: github.com/gowalla/AFNetworking/issues/36 Mungkin itu membantu seseorang cara mengintegrasikan JSONKit dalam Proyek yang Didukung iOS5 ARC ;-) Tetapi saya belum mencobanya saat ini ...
Metode ini bekerja untuk saya. Saya menambahkan AsyncUdpSocket untuk UDP Multicast ke proyek saya dan file-file itu [setidaknya versi saat ini] TIDAK mendukung ARC. Jadi saya menggunakan metode di atas untuk menambahkan flag compiler ke file AsyncUdpSocket.m dan saya bisa mendapatkan kode untuk berfungsi dengan baik dengan aplikasi saya.
Ashu Joshi
2
Ini bekerja dengan sempurna! Spesifik: Buka Target Anda dan pilih Bangun Fase, lalu Kompilasi Sumber. Jika Anda mengklik dua kali pada file .m yang dimaksud, itu akan memunculkan kotak tempat Anda dapat mengetik / menempel: "-fno-objc-arc"
mpemburn

Jawaban:

73

Dokumen ARC publik , meskipun tidak secara langsung menjelaskan tentang hal ini, tampaknya menunjukkan bahwa selama setiap kelas adalah semua ARC atau semua dikelola secara manual, kelas-kelas tersebut dapat diintegrasikan ke dalam satu program tunggal.

Anda hanya tidak dapat mencampur ARC dan non-ARC dalam satu kelas; dokumen mengatakan bahwa mengirim retain, release, autorelease, atau retainCountpesan dengan cara apapun (termasuk timer dan Melakukan tertunda, yang digunakan @selector) dilarang dalam kode ARC. Jadi Anda tidak dapat melakukan non-ARC di kelas ARC (karena pesan yang diperlukan dilarang) dan Anda tidak dapat melakukan ARC di kelas non-ARC (karena ARC menambahkan elemen sintaks yang tidak valid tanpa ARC).

Dokumen yang sama sedikit lebih jelas tentang apakah Anda dapat mengintegrasikan pustaka / kerangka kerja non-ARC ke dalam program ARC: Ya. Tidak disebutkan apakah Anda dapat menggunakan pustaka / kerangka kerja ARC dalam program di mana semua kode Anda non-ARC, tetapi mengingat semua hal di atas, implikasinya tampaknya ya.

Peter Hosey
sumber
Terima kasih! Saya telah menemukan cara untuk menonaktifkan ARC untuk kelas non-ARC yang ada.
aman
Bisakah Anda berbagi dengan kami apa yang Anda lakukan?
David H
1
@ David H: Jika Anda bermaksud mengatasinya kepada si penanya, Anda harus memperhatikan bahwa si penanya mengedit solusi mereka menjadi pertanyaan.
Peter Hosey
Kompilasi ARC tidak dapat dinonaktifkan dalam file HEADER. Dentang TIDAK akan mengkompilasi antarmuka / header berdasarkan kompilasi file implementasi / metode itu. Oleh karena itu, file Header harus kompatibel dengan ARC dan non-ARC dalam kompilasi campuran. Saya melihat ini sebagai bug di kompiler.
carmin
1
@armin: Tidak. Kompiler tidak melihat file header kecuali ketika Anda menyuruhnya, yang biasanya Anda lakukan hanya dengan #importmemasukkannya dari file modul. Pengaturan flag compiler adalah untuk setiap file modul (lebih tepatnya, setiap file dalam fase pembangunan "Sumber Kompilasi"). Kompiler tidak memiliki cara untuk mengetahui apakah ia harus menggunakan ARC atau tidak untuk file lain, kecuali dengan mewarisi pilihan yang diberikan untuk file modul yang dimulainya.
Peter Hosey
78

Ini tidak terlalu intuitif cara menonaktifkan ARC pada file GANDA , untuk sementara waktu saya melakukannya satu per satu sampai menemukan cara untuk melakukannya.

  1. Pilih yang diinginkan file yang di Target / Build Phases / Compile Sumber dalam Xcode (CMD + klik atau Shift + klik)
  2. PRESS ENTER (klik dua kali akan mengatur ulang pilihan, sehingga tidak berfungsi)
  3. Ketik -fno-objc-arc
  4. Tekan Enter atau Done
Tibidabo
sumber
1
Ini sebenarnya bukan jawaban untuk pertanyaan yang diajukan di sini, tetapi tip yang bagus sekali! Memilih +1
Kristof Van Landschoot
Anda benar, bukan, tapi saya selalu mencari Google di saklar dan jawaban ini adalah salah satu top hit. Saya pikir hari ini kebanyakan orang sudah tahu jawabannya tetapi tidak "tip" ini
Tibidabo
35

Jika Anda ingin menonaktifkan Penghitungan Referensi Otomatis untuk beberapa File, maka itu sangat sederhana untuk dilakukan, ikuti saja langkah-langkahnya. Anda menambahkan flag kompiler di Target -> Build Phases -> Compile Sources.

xcode

Bendera yang digunakan adalah -fno-objc-arc tekan enter setelah menulisnya.! Anda harus mengklik dua kali pada kolom kanan baris di bawah Compiler Flags. Semoga ini membantu Terima kasih :)

Nikhil Bansal
sumber
14
Anda dapat menggunakan metode yang sama untuk mengaktifkan ARC pada file tertentu dalam proyek non-ARC dengan menggunakan flag -fobjc-arc.
lnafziger
Kompilasi ARC tidak dapat dinonaktifkan dalam file HEADER. Dentang TIDAK akan mengkompilasi antarmuka / header berdasarkan kompilasi file implementasi / metode itu. Oleh karena itu, file Header harus kompatibel dengan ARC dan non-ARC dalam kompilasi campuran. Saya melihat ini sebagai bug di kompiler.
carmin