Po aktualizacji do Xcode 7.3 zgłasza błąd Cannot create __weak reference in file using manual reference counting
w plikach pod. Czy ktoś rozwiązał ten problem?
Odpowiedzi:
Ustaw Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
na YES
.
Zaczerpnięte z forów deweloperów Apple - Xcode 7.3b4, inny niż arc, nie może utworzyć __weak odwołania .
To jest oficjalna odpowiedź od Apple z linku:
Ten problem zachowuje się zgodnie z przeznaczeniem na podstawie następujących informacji: Jesteśmy w trakcie implementowania słabych odwołań we wszystkich trybach języka Objective-C. Ponieważ „__weak” był historycznie ignorowany w trybach języka innych niż ARC (i nie-GC), dodaliśmy ten błąd, aby wskazać miejsca, w których semantyka zmieni się w przyszłości. Zaktualizuj swój raport o błędzie, aby dać nam znać, czy nadal jest to dla Ciebie problem.
Zasadniczo, jeśli używasz Poda dla bibliotek innych firm, musisz albo usunąć __weak w innym miejscu niż ARC lub poczekać na aktualizację.
Aktualizacja @ 23.03
Powinienem był dowiedzieć się więcej o flagach, które mogę przekazać do osoby odpowiedzialnej, aby ominąć tego rodzaju rzeczy. Jednak zasadniczo nie należy __weak
od teraz używać w trybie innym niż ARC, aby uniknąć nieoczekiwanych konfliktów. Dla użytkowników cocoapods nie musisz usuwać __weak
ani czekać na aktualizację, ale ustaw Weak References in Manual Retain Release
flagę w ustawieniach kompilacji na TAK, jak powiedział Lean. Mam nadzieję, że to pomoże.
Najlepszym sposobem rozwiązania tego problemu jest dodanie post_install
skryptu do pliku Podfile, który ustawia Weak References in Manual Retain Release
flagę yes
we wszystkich celach pod. Aby to zrobić, po prostu wklej następujący kod u dołu pliku 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
Czasami takie postępowanie powoduje błąd -fobjc-weak is not supported on the current deployment target
. Możesz rozwiązać ten problem, dodając kolejną opcję konfiguracji, zmuszając wszystkie pody do kierowania na żądaną wersję ( na podstawie tej odpowiedzi ):
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
Obejście słabych odniesień Facebooka w FBSettings.m
Do Podfile można napisać skrypt do uruchomienia po instalacji / aktualizacji poda, opisuje tam co następuje.
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 jak znaleźć słowa tej magii. .
Znalazłem to.
Myślę, że oznaczało to usunięcie __weak
https://forums.developer.apple.com/thread/38934
Erm, czy kiedykolwiek istniało coś takiego jak słabe odniesienie do zmiennej w MRR [ręczne zwalnianie podtrzymujące]? „__weak” oznacza jedną lub obie z dwóch rzeczy:
Nieposiadane odniesienie (tj. Nie reprezentujące liczby zachowań).
Odniesienie zerujące (tj. Że środowisko wykonawcze wyzeruje, gdy obiekt, do którego istnieje odwołanie, zostanie zwolniony).
Punkt 1 nie dotyczy MRR, ponieważ i tak po prostu nie zachowujesz zmiennej.
Punkt 2 nie dotyczy również MRR, ponieważ obsługa środowiska wykonawczego znajduje się w GC i ARC [automatyczne liczenie odniesień], których nie używasz.
Wygląda na to, że kompilator narzeka teraz, że nie może zrobić tego, czego nigdy nie zrobił. (A w przypadku delegata aplikacji nie można było odróżnić różnicy w czasie wykonywania, ponieważ delegat aplikacji zazwyczaj nigdy nie jest zwalniany).
Lub zmień __weak
na __unsafeunretained
. To rozwiąże problem w tradycji. Ponieważ MRC (przed xCode 4 -) __weak nie był w iOS.
-Wall -Wextra -Wno-unused-parameter
flagi ostrzegawcze.