Xcode 7.3 tidak dapat membuat referensi __weak dalam file menggunakan penghitungan referensi manual

86

Setelah memperbarui ke Xcode 7.3, itu memunculkan kesalahan Cannot create __weak reference in file using manual reference countingdalam file pod. Apakah ada yang memecahkan masalah ini?

REALFREE
sumber

Jawaban:

177

Setel Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseke YES.

Contoh visual

Diambil dari Apple Developers Forums - Xcode 7.3b4, non-arc, tidak dapat membuat referensi __weak .

Ryan
sumber
7
Ini masih tidak berhasil untuk saya :( mungkinkah ada tanda kompilator lain yang menimpa setelan ini yang mungkin saya aktifkan? Saya telah -Wall -Wextra -Wno-unused-parametermengaktifkan tanda Peringatan ini .
Kdawgwilk
6
@Kdgwil Anda yakin mengaktifkan flag itu dengan benar? Jika itu dalam proyek Anda, Anda cukup menghapus __weak kata kunci tho. Saya tidak mencoba tetapi Anda juga dapat mencoba mengaktifkan flag di proyek Pod jika Anda menggunakan Pod
REALFREE
3
Perhatikan jika Anda saat ini menjalankan pemasangan pod / pembaruan pod, Referensi Lemah di Rilis Penahan Manual disetel ke NO untuk setiap target pod - dan Anda harus mengedit setelan build lagi.
Damo
2
Saya harus melakukan ini dalam pengaturan proyek pod juga.
Bernard
jawaban yang luar biasa guys.
Bartłomiej Semańczyk
21

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 __weakmode non-ARC mulai sekarang untuk menghindari konflik yang tidak terduga. Untuk pengguna cocoapods, Anda tidak perlu menghapus __weakatau menunggu update tetapi mengatur Weak References in Manual Retain Releaseflag di pengaturan build ke YES seperti yang dikatakan Lean. Semoga bantuan ini.

REALFREE
sumber
1
Perhatikan jika Anda saat ini menjalankan pemasangan pod / pembaruan pod, Referensi Lemah di Rilis Penahan Manual disetel ke NO untuk setiap target pod - dan Anda harus mengedit setelan build lagi.
Damo
20

Cara terbaik untuk mengatasinya adalah dengan menambahkan post_installskrip ke Podfile Anda yang menetapkan Weak References in Manual Retain Releaseflag ke yessemua 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
villy393
sumber
Ide yang hebat! Ini berhasil untuk saya, karena saya menggunakan Cocoapods. Terima kasih.
mginius
3
Saya mendapat kesalahan follwing: -fobjc-weak tidak didukung pada target penerapan saat ini
g212gs
Saya juga mendapatkan kesalahan -fobjc-weak, tetapi berhasil memperbaikinya dengan menyetel semua target penyebaran pod ke 8.3 (target penerapan proyek saya). Anda dapat melakukannya dengan skrip, seperti yang disarankan dalam skrip ke-2 di atas.
Xys
8

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. XHTML yang valid.

Manobala
sumber
1
Sekadar catatan: Sepertinya FB telah mengubah baris menyinggung di v3.24.4, untuk baris rilis 3.x. (Tidak yakin dengan seri 4.x, tapi sepertinya tidak ada di sana sekarang.)
big_m
7

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:

  1. Referensi tidak berpemilik (yaitu tidak mewakili jumlah retensi).

  2. 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.)

kekurangan
sumber
1

Cukup goto target Anda di tab "Build Phases", cari file pod di "Compile Sources", klik file tersebut dan tambahkan bendera compiler "-fobjc-arc"

peski
sumber
0

Atau ubah __weakmenjadi __unsafeunretained. Ini akan menyelesaikan masalah dalam tradisi. Sejak MRC (sebelum xCode 4 -) __weak tidak ada di iOS.


sumber