Xcode 7.3 kann keine __schwache Referenz in einer Datei mithilfe der manuellen Referenzzählung erstellen


86

Nach dem Update auf Xcode 7.3 wird der Fehler Cannot create __weak reference in file using manual reference countingin Pod-Dateien ausgegeben. Hat jemand dieses Problem gelöst?

Antworten:


176

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

Visuelles Beispiel

Entnommen aus Apple Developers Forums - Xcode 7.3b4, kein Bogen, kann keine __schwache Referenz erstellen .


7
Dies funktioniert immer noch nicht für mich :( Könnte es ein anderes Compiler-Flag geben, das diese Einstellung überschreibt, die ich möglicherweise aktiviert habe? Ich habe diese -Wall -Wextra -Wno-unused-parameterWarnflags aktiviert.
Kdawgwilk

6
@Kdawgwilk Bist du sicher, dass du diese Flagge richtig einschaltest? Wenn es in Ihrem Projekt ist, können Sie einfach das __schwache Schlüsselwort tho löschen. Ich habe es nicht versucht, aber Sie können auch versuchen, die Flagge im Pod-Projekt zu
aktivieren,

3
Hinweis: Wenn Sie derzeit die Pod-Installation / Pod-Aktualisierung ausführen, werden die schwachen Referenzen in Manual Retain Release für jedes Pod-Ziel auf NO gesetzt. Sie müssen die Build-Einstellungen erneut bearbeiten.
Damo

2
Ich musste dies auch im Pod-Projekt tun.
Bernard

tolle Antwort Jungs.
Bartłomiej Semańczyk

21

Dies ist die offizielle Antwort von Apple über den Link:

Dieses Problem verhält sich wie folgt: Wir sind dabei, schwache Referenzen in allen Objective-C-Sprachmodi zu implementieren. Da "__weak" in Nicht-ARC- (und Nicht-GC-) Sprachmodi in der Vergangenheit ignoriert wurde, haben wir diesen Fehler hinzugefügt, um auf Stellen hinzuweisen, an denen sich die Semantik in Zukunft ändern wird. Bitte aktualisieren Sie Ihren Fehlerbericht, um uns mitzuteilen, ob dies immer noch ein Problem für Sie ist.

Wenn Sie also Pod für Bibliotheken von Drittanbietern verwenden, müssen Sie entweder __weak in Nicht-ARC löschen oder auf die Aktualisierung warten.

Update @ 3/23

Ich hätte mehr über Flaggen recherchieren sollen, die ich an Complier weitergeben kann, um diese Art von Dingen zu umgehen. Grundsätzlich sollten Sie __weakab sofort nicht mehr im Nicht-ARC-Modus arbeiten, um unerwartete Konflikte zu vermeiden. Für Cocoapods-Benutzer müssen Sie nicht löschen __weakoder auf die Aktualisierung warten, sondern das Weak References in Manual Retain ReleaseFlag in den Build-Einstellungen auf JA setzen, wie Lean sagte. Ich hoffe das hilft.


1
Hinweis: Wenn Sie derzeit die Pod-Installation / Pod-Aktualisierung ausführen, werden die schwachen Referenzen in Manual Retain Release für jedes Pod-Ziel auf NO gesetzt. Sie müssen die Build-Einstellungen erneut bearbeiten.
Damo

20

Der beste Weg, dies zu lösen, besteht darin post_install, Ihrem Podfile ein Skript hinzuzufügen, das das Weak References in Manual Retain ReleaseFlag yesin allen Ihren Pod-Zielen setzt. Fügen Sie dazu einfach den folgenden Code unten in Ihr Feld ein 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

Dies führt manchmal zu einem Fehler -fobjc-weak is not supported on the current deployment target. Sie können dies lösen, indem Sie eine weitere Konfigurationsoption hinzufügen und alle Pods dazu zwingen, auf die gewünschte Version abzuzielen ( basierend auf dieser Antwort ):

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

Großartige Idee! Es funktioniert für mich, weil ich Cocoapods benutze. Vielen Dank.
Mginius

3
Ich habe folgenden Fehler erhalten: -fobjc-schwach wird auf dem aktuellen Bereitstellungsziel nicht unterstützt
g212gs

Ich habe auch den Fehler -fobjc-schwach erhalten, konnte ihn jedoch beheben, indem ich das Pods-Bereitstellungsziel auf 8.3 (mein Projektbereitstellungsziel) festgelegt habe. Sie können dies jedoch mit einem Skript tun, wie im zweiten Skript oben vorgeschlagen.
Xys

8

Problemumgehung für schwache Facebook-Referenzen in FBSettings.m

In Podfile ist es möglich, ein Skript zu schreiben, das nach der Installation / Aktualisierung des Pods ausgeführt wird. Dort wird Folgendes beschrieben.

 
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 wie man die Worte der Magie findet, die. Gültiges XHTML.


1
Nur eine Anmerkung: Anscheinend hat FB die fehlerhafte Zeile in Version 3.24.4 für die 3.x-Release-Zeile geändert. (Ich
bin

7

Ich habe das gefunden.

Ich denke, es ist bedeutet, __weak zu löschen

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

Ähm, gab es jemals eine schwache Variablenreferenz unter MRR [manuelle Retain-Release]? "__schwach" bedeutet eines oder beide von zwei Dingen:

  1. Eine nicht besessene Referenz (dh keine Aufbewahrungsanzahl).

  2. Eine Nullreferenz (dh die Laufzeit wird auf Null gesetzt, wenn die Zuordnung des referenzierten Objekts aufgehoben wird).

# 1 gilt nicht für MRR, da Sie die Variable sowieso nicht beibehalten.

# 2 gilt auch nicht für MRR, da die Laufzeitunterstützung in GC und ARC [automatische Referenzzählung] erfolgt, die Sie nicht verwenden.

Es hört sich so an, als würde sich der Compiler jetzt nur beschweren, dass er nicht das tun kann, was er niemals tun könnte. (Und im Fall eines App-Delegaten können Sie den Unterschied zur Laufzeit nicht erkennen, da der App-Delegat im Allgemeinen nie freigegeben wird.)


1

Gehen Sie einfach zu Ihrem Ziel auf der Registerkarte "Phasen erstellen" und suchen Sie die Pod-Dateien in "Quellen kompilieren", klicken Sie auf diese Dateien und fügen Sie das Compiler-Flag "-fobjc-arc" hinzu.


0

Oder wechseln Sie __weakzu __unsafeunretained. Dies wird das Problem in der Tradition lösen. Da MRC (vor xCode 4 -) __weak nicht in iOS war.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.