Xcode 7.3 nie może utworzyć __weak odwołania w pliku przy użyciu ręcznego liczenia odwołań

86

Po aktualizacji do Xcode 7.3 zgłasza błąd Cannot create __weak reference in file using manual reference countingw plikach pod. Czy ktoś rozwiązał ten problem?

REALFREE
źródło

Odpowiedzi:

176

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

Przykład wizualny

Zaczerpnięte z forów deweloperów Apple - Xcode 7.3b4, inny niż arc, nie może utworzyć __weak odwołania .

Ryan
źródło
7
To nadal nie działa dla mnie :( czy może istnieć inna flaga kompilatora, która zastępuje to ustawienie, które mogłem włączyć? Mam włączone te -Wall -Wextra -Wno-unused-parameterflagi ostrzegawcze.
Kdawgwilk
6
@Kdawgwilk Czy na pewno włączyłeś tę flagę poprawnie? Jeśli jest w twoim projekcie, możesz po prostu usunąć słowo kluczowe __weak. Nie próbowałem, ale możesz też spróbować włączyć flagę w projekcie Poda, jeśli używasz Poda
REALFREE
3
Zwróć uwagę, że jeśli obecnie uruchamiasz instalację / aktualizację poda, wówczas słabe odniesienia w ręcznym utrzymaniu wersji są ustawione na NIE dla każdego celu - i będziesz musiał ponownie edytować ustawienia kompilacji.
Damo
2
Musiałem to zrobić również w ustawieniach projektu pod.
Bernard
świetna odpowiedź.
Bartłomiej Semańczyk 10.10.16
21

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 __weakod teraz używać w trybie innym niż ARC, aby uniknąć nieoczekiwanych konfliktów. Dla użytkowników cocoapods nie musisz usuwać __weakani czekać na aktualizację, ale ustaw Weak References in Manual Retain Releaseflagę w ustawieniach kompilacji na TAK, jak powiedział Lean. Mam nadzieję, że to pomoże.

REALFREE
źródło
1
Zwróć uwagę, że jeśli obecnie uruchamiasz instalację / aktualizację poda, wówczas słabe odniesienia w ręcznym utrzymaniu wersji są ustawione na NIE dla każdego celu - i będziesz musiał ponownie edytować ustawienia kompilacji.
Damo
20

Najlepszym sposobem rozwiązania tego problemu jest dodanie post_installskryptu do pliku Podfile, który ustawia Weak References in Manual Retain Releaseflagę yeswe 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
villy393
źródło
Świetny pomysł! To działa dla mnie, ponieważ używam Cocoapods. Dzięki.
mginius
3
Pojawił się następujący błąd: -fobjc-słaby nie jest obsługiwany w obecnym celu wdrożenia
g212gs
Otrzymałem również błąd -fobjc-słaby, ale udało mi się go naprawić, ustawiając wszystkie cele wdrażania podów na 8.3 (mój cel wdrożenia projektu). Możesz to jednak zrobić za pomocą skryptu, jak zasugerowano w drugim skrypcie powyżej.
Xys
8

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. Prawidłowy XHTML.

Manobala
źródło
1
Tylko uwaga: wygląda na to, że FB zmienił niewłaściwą linię w wersji 3.24.4 dla wersji 3.x. (Nie jestem pewien co do serii 4.x, ale wygląda na to, że nie jest tam teraz.)
big_m
7

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:

  1. Nieposiadane odniesienie (tj. Nie reprezentujące liczby zachowań).

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

brak
źródło
1

Po prostu przejdź do swojego celu w zakładce "Fazy kompilacji", poszukaj plików pod w "Źródłach kompilacji", kliknij te pliki i dodaj flagę kompilatora "-fobjc-arc"

peski
źródło
0

Lub zmień __weakna __unsafeunretained. To rozwiąże problem w tradycji. Ponieważ MRC (przed xCode 4 -) __weak nie był w iOS.


źródło