Pertanyaan Apakah ARC benar-benar didukung di iOS 4? SDK 4.2 iOS kehilangan simbol terkait ARC pada waktu penautan


Saya telah membaca dan mendengar sejak ARC pertama kali diumumkan bahwa itu adalah waktu kompilasi dan akan kompatibel dengan iOS 4. Saya telah berhasil merefleksikan proyek saya ke ARC menggunakan refactoring otomatis Xcode 4.2, dan ketika dikompilasi terhadap SDK iOS 5.0, berfungsi dengan baik. Namun, jika saya mencoba mengkompilasi terhadap SDK 4.2 iOS saya, gagal pada waktu tautan, tidak memiliki simbol berikut:

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue
  • _objc_storeStrong
  • _objc_retain
  • _objc_release
  • _objc_retainAutoreleasedReturnValue

Saya memeriksa, dan simbol-simbol ini ada di 5.0 tetapi tidak 4.2:

iPhoneOS5.0.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
00005ed0 T _objc_retain
000061d0 T _objc_retain

iPhoneOS4.2.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
[... *crickets* ...]

Apakah ini berarti Apple berbohong? Saya berasumsi bahwa saya bingung dan melakukan sesuatu yang salah, tetapi saya tidak tahu apa.

Ini dengan rilis GM Xcode 4.2 (Build 4C199)


32
2017-10-12 23:30


asal


Jawaban:


ARC didukung pada iOS 4.3 dan di atasnya. Anda perlu menggunakan iOS 5.x SDK tetapi dapat memilih iOS 4.3 untuk Target Penerapan. Satu hal yang tidak didukung di 4.x adalah pemblokiran referensi otomatis yang lemah.

Lihat dokumentasi Apple sini untuk Indeks Ketersediaan Fitur Objective-C.

Xcode 4.4 dan 4.5 dapat digunakan untuk mengirimkan aplikasi.

Perhatikan bahwa NSDictionary dan NSArray subscripting menyebarkan kembali ke OS X 10.6 dan iOS 4, pastikan untuk mengatur target penyebaran kembali juga.


34
2017-10-12 23:34



Sedikit terlambat, tetapi ini adalah informasi penting. Jawaban yang diterima benar, Apple menyatakan iOS 4.0 dan di atasnya sebagai OS minimum untuk dukungan ARC.

Namun, itu bisa pecah dalam beberapa situasi. Salah satunya tentu saja __weak kata kunci dan turunannya. Anda akan melihat kesalahan seperti berikut ini.

dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak

Kondisi kedua dan sangat berbahaya adalah ketika Anda menggunakan +load metode NSObject. Jika Anda melakukan ini menggunakan ARC di iOS 4.x Anda akan memiliki crash runtime yang sangat sulit ditemukan. Jika Anda mendapatkan kesalahan runtime seperti berikut ini, periksa +load metode. Bagi saya itu bekerja untuk mengatur bendera -fno-objc-arc untuk file tertentu.

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue

11
2017-08-28 07:50