Xcode 7.3, manuel referans sayımı kullanarak dosyada __weak referans oluşturamıyor


86

Xcode 7.3'e güncelledikten sonra, hatayı Cannot create __weak reference in file using manual reference countingpod dosyalarında atar . Bu sorunu çözen var mı?

Yanıtlar:


177

Set Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseiçin YES.

Görsel örnek

Apple Developers Forumlarından Alındı - Xcode 7.3b4, ark dışı, __weak referans oluşturamaz .


7
Bu hala benim için çalışmıyor :( etkinleştirmiş olabileceğim bu ayarı geçersiz kılan başka bir derleyici bayrağı olabilir mi? Bu -Wall -Wextra -Wno-unused-parameterUyarı bayraklarını etkinleştirdim.
Kdawgwilk

6
@Kdawgwilk Bu bayrağı doğru açtığınızdan emin misiniz? Eğer projenizdeyse __weak anahtar kelimesini tho silebilirsiniz.
Denemedim ama

3
Şu anda pod yükleme / pod güncellemesini çalıştırırsanız, Manuel Tutma Sürümündeki Zayıf Referanslar her bir kapsül hedefi için HAYIR olarak ayarlanır - ve yapı ayarlarını yeniden düzenlemeniz gerekir.
Damo

2
Bunu pod proje ortamında da yapmak zorunda kaldım.
Bernard

harika cevap çocuklar.
Bartłomiej Semańczyk

21

Bu, bağlantıdan Apple'ın resmi cevabı:

Bu sorun, aşağıdakilere dayalı olarak amaçlandığı gibi davranır: Tüm Objective-C dil modlarında zayıf referanslar uygulama sürecindeyiz. Geçmişte ARC olmayan (ve GC olmayan) dil modlarında "__weak" yok sayıldığından, gelecekte anlambilimin değişeceği yerleri belirtmek için bu hatayı ekledik. Bunun sizin için hala bir sorun olup olmadığını bize bildirmek için lütfen hata raporunuzu güncelleyin.

Dolayısıyla, temel olarak, 3. taraf kitaplıklar için Kapsül kullanıyorsanız, ARC olmayan __weak'i silmeniz veya güncelleme için beklemeniz gerekir.

Güncelleme @ 3/23

Bu tür şeyleri atlamak için complier'a geçebileceğim bayraklar hakkında daha fazla araştırma yapmalıydım. Ancak temelde, __weakbeklenmedik çatışmalardan kaçınmak için şu andan itibaren ARC olmayan modda kullanmamalısınız . Cocoapods kullanıcıları için, __weakgüncellemeyi silmenize veya beklemenize gerek yoktur, ancak Weak References in Manual Retain ReleaseYalın'ın dediği gibi yapı ayarlarında bayrağı EVET olarak ayarlamanız gerekir. Umarım bu yardımcı olur.


1
Şu anda pod yükleme / pod güncellemesini çalıştırırsanız, Manuel Tutma Sürümündeki Zayıf Referanslar her bir kapsül hedefi için HAYIR olarak ayarlanır - ve yapı ayarlarını yeniden düzenlemeniz gerekir.
Damo

20

Bunu çözmenin en iyi yolu post_install, Pod Dosyanıza tüm bölme hedeflerinizde Weak References in Manual Retain Releasebayrağı ayarlayan bir komut dosyası eklemektir yes. Bunu yapmak için, aşağıdaki kodu 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

Bazen bunu yapmak hatayla sonuçlanır -fobjc-weak is not supported on the current deployment target. Bunu, başka bir yapılandırma seçeneği ekleyerek, tüm bölmeleri istediğiniz sürümü hedeflemeye zorlayarak çözebilirsiniz ( bu yanıta göre ):

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

İyi fikir! Benim için çalışıyor çünkü Cocoapods kullanıyorum. Teşekkürler.
mginius

3
Follwing hatası aldım: -fobjc-zayıf, mevcut dağıtım hedefinde desteklenmiyor
g212gs

-Fobjc-zayıf hatasını da aldım, ancak tüm bölme dağıtım hedefini 8.3'e (proje dağıtım hedefim) ayarlayarak düzeltmeyi başardım. Yine de, yukarıdaki 2. komut dosyasında önerildiği gibi bir komut dosyasıyla da yapabilirsiniz.
Xys

8

FBSettings.m'deki Facebook zayıf referansları için geçici çözüm

Pod dosyasına, pod kurulumundan / güncellemesinden sonra çalışacak bir komut dosyası yazmak mümkündür, burada aşağıdakiler açıklanmaktadır.

 
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 o büyü kelimelerini nasıl bulacağını. Geçerli XHTML.


1
Sadece bir not: Görünüşe göre FB, 3.x sürüm satırı için v3.24.4'te sorunlu satırı değiştirdi. (4.x serisi hakkında emin değilim, ancak şu anda orada olduğu gibi görünmüyor.)
big_m

7

Bunu buldum.

Sanırım bu __weak'i silmek anlamına geliyor

https://forums.developer.apple.com/thread/38934

Eee, MRR [manuel tutma-bırakma] altında zayıf değişken referansı diye bir şey var mıydı? "__weak" iki şeyden biri veya her ikisi anlamına gelir:

  1. Sahipsiz bir referans (yani bir elde tutma sayısını temsil etmeyen).

  2. Sıfırlama referansı (yani, başvurulan nesnenin serbest bırakılması durumunda çalışma zamanının sıfırlanması).

# 1 MRR için geçerli değildir, çünkü zaten değişkeni korumazsınız.

# 2, MRR için de geçerli değildir çünkü çalışma zamanı desteği, kullanmadığınız GC ve ARC'de [otomatik referans sayma].

Görünüşe göre derleyici şimdi asla yapamayacağı şeyi yapamayacağından şikayet ediyor. (Ve bir uygulama temsilcisi söz konusu olduğunda, uygulama temsilcisi genellikle hiçbir zaman serbest bırakılmadığından, çalışma zamanında farkı söyleyemezsiniz.)


1

"Derleme Aşamaları" sekmesinde hedefinize gidin, "Derleme Kaynakları" ndaki pod dosyalarını arayın, bu dosyaları tıklayın ve "-fobjc-arc" derleyici bayrağı ekleyin


0

Veya değiştirmek __weakiçin __unsafeunretained. Bu, gelenekteki sorunu çözecektir. MRC'den beri (xCode 4'ten önce -) __weak iOS'ta değildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.