wake-up-neo.com

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

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

79
REALFREE

Setzen Sie Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release auf YES

Visual example

Aus Apple-Entwicklerforen - Xcode 7.3b4 (nicht arc) kann keine __weak-Referenz erstellen .

170
Ryan

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

Dieses Problem verhält sich wie beabsichtigt basierend auf Folgendem: Wir befinden uns in der Implementierung schwacher Verweise in der gesamten Objective-C-Sprache Modi. Da "__weak" in den Sprachmodi, die kein ARC (und Nicht-GC) sind, bisher ignoriert wurde, haben wir diesen Fehler hinzugefügt, um die Bereiche anzuzeigen wo sich die Semantik zukünftig ändern wird. Bitte aktualisieren Sie Ihren Fehler Melden Sie sich, um uns mitzuteilen, ob dies 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 ein Update warten. 

Update @ 3/23

Ich sollte mehr über Flaggen recherchieren, die ich an Complier übergeben kann, um diese Sachen zu umgehen. Grundsätzlich sollten Sie __weak jedoch ab sofort nicht im ARC-Modus verwenden, um unerwartete Konflikte zu vermeiden. Für Benutzer von cocoapods müssen Sie nicht __weak löschen oder auf ein Update warten, sondern Weak References in Manual Retain Release in den Build-Einstellungen auf YES setzen, wie Lean sagte. Ich hoffe das hilft. 

20
REALFREE

Sie können dies am besten beheben, indem Sie Ihrer Poddatei ein post_install-Skript hinzufügen, das das Weak References in Manual Retain Release-Flag in allen Ihren Pod-Zielen auf yes setzt. Fügen Sie dazu einfach den folgenden Code am unteren Rand Ihrer Podfile ein.

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

Manchmal führt dies zu dem 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, die gewünschte Version als Ziel festzulegen ( 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
20
villy393

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

In der Poddatei ist es möglich, ein Skript zu schreiben, das nach der Installation/Aktualisierung des Pods ausgeführt wird. In diesem Abschnitt 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 So finden Sie die Wörter der Magie, die .Valid XHTML.

8
Manobala

Ich habe das gefunden.

Ich vermute, dass es bedeutet, __weak zu löschen 

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

Ähm, gab es jemals einen schwachen variablen Bezug unter MRR (Manual Retain Release)? "__weak" bedeutet eine oder beide von zwei Dingen:

  1. Eine nicht besetzte Referenz (d. H., Die keine Zurückbehaltungszählung darstellt).

  2. Eine Nullungsreferenz (d. H., Dass die Laufzeit null wird, wenn das referenzierte Objekt freigegeben wird).

Nummer 1 gilt nicht für die MRR, weil Sie die Variable sowieso nicht behalten.

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

Es klingt, als würde sich der Compiler jetzt nur beschweren, dass er nicht das tun kann, was er niemals tun könnte. (Und im Falle eines App-Delegierten können Sie den Unterschied zur Laufzeit nicht feststellen, da der App-Delegat im Allgemeinen niemals freigegeben wird.)

7
lack

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

1
peski

Oder ändern Sie __weak in __unsafeunretained. Dies löst das Problem in der Tradition. Da MRC (vor xCode 4 -) __weak nicht in iOS war.

0
user3693546