Setelah memperbarui ke Xcode 7.3, itu memunculkan kesalahan Cannot create __weak reference in file using manual reference counting
dalam file pod. Apakah ada yang memecahkan masalah ini?
Jawaban:
Setel Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
ke YES
.
Diambil dari Apple Developers Forums - Xcode 7.3b4, non-arc, tidak dapat membuat referensi __weak .
Ini adalah jawaban resmi dari Apple dari tautan:
Masalah ini berperilaku sebagaimana dimaksud berdasarkan berikut ini: Kami sedang dalam proses menerapkan referensi lemah di semua mode bahasa Objective-C. Karena "__weak" secara historis telah diabaikan dalam mode bahasa non-ARC (dan non-GC), kami telah menambahkan kesalahan ini untuk menunjukkan tempat di mana semantik akan berubah di masa mendatang. Perbarui laporan bug Anda untuk memberi tahu kami jika ini masih menjadi masalah Anda.
Jadi pada dasarnya, jika Anda menggunakan Pod untuk library pihak ketiga, Anda harus menghapus __weak di non-ARC atau menunggu update.
Perbarui @ 3/23
Saya harus meneliti lebih banyak tentang bendera yang dapat saya berikan ke pelengkap untuk melewati hal-hal semacam ini. Namun pada dasarnya Anda tidak boleh menggunakan __weak
mode non-ARC mulai sekarang untuk menghindari konflik yang tidak terduga. Untuk pengguna cocoapods, Anda tidak perlu menghapus __weak
atau menunggu update tetapi mengatur Weak References in Manual Retain Release
flag di pengaturan build ke YES seperti yang dikatakan Lean. Semoga bantuan ini.
Cara terbaik untuk mengatasinya adalah dengan menambahkan post_install
skrip ke Podfile Anda yang menetapkan Weak References in Manual Retain Release
flag ke yes
semua target pod Anda. Untuk melakukan itu cukup tempel kode berikut di bagian bawah file Podfile
.
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
end
end
end
Terkadang, melakukan itu menghasilkan kesalahan -fobjc-weak is not supported on the current deployment target
. Anda dapat mengatasinya dengan menambahkan opsi konfigurasi lain, memaksa semua pod untuk menargetkan versi yang Anda inginkan ( berdasarkan jawaban ini ):
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.3'
end
end
end
Solusi untuk referensi lemah Facebook di FBSettings.m
Untuk Podfile, dimungkinkan untuk menulis skrip untuk dijalankan setelah pod install / update, menjelaskan hal berikut di sana.
post_install do | installer |
classy_pods_target = installer.pods_project.targets.find {| target | target.name == 'Facebook-iOS-SDK'}
classy_pods_target.build_configurations.each do | config |
config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
end
end
CLANG_ENABLE_OBJC_WEAK bagaimana menemukan kata-kata ajaib itu. .
Saya telah menemukan ini.
Saya kira itu berarti menghapus __weak
https://forums.developer.apple.com/thread/38934
Erm, pernahkah ada yang namanya referensi variabel lemah di bawah MRR [manual retur-release]? "__weak" berarti satu atau kedua hal:
Referensi tidak berpemilik (yaitu tidak mewakili jumlah retensi).
Referensi zeroing (yaitu runtime nol saat objek yang direferensikan dibatalkan alokasinya).
# 1 tidak berlaku untuk MRR, karena Anda tidak menyimpan variabelnya.
# 2 juga tidak berlaku untuk MRR, karena dukungan waktu proses ada di GC dan ARC [penghitungan referensi otomatis], yang tidak Anda gunakan.
Sepertinya kompilator sekarang hanya mengeluh bahwa ia tidak dapat melakukan apa yang tidak dapat dilakukannya. (Dan dalam kasus delegasi aplikasi, Anda tidak akan dapat membedakannya pada waktu proses, karena delegasi aplikasi umumnya tidak pernah dibatalkan alokasinya.)
Atau ubah __weak
menjadi __unsafeunretained
. Ini akan menyelesaikan masalah dalam tradisi. Sejak MRC (sebelum xCode 4 -) __weak tidak ada di iOS.
-Wall -Wextra -Wno-unused-parameter
mengaktifkan tanda Peringatan ini .