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?
Setzen Sie Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
auf YES
.
Aus Apple-Entwicklerforen - Xcode 7.3b4 (nicht arc) kann keine __weak-Referenz erstellen .
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.
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
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 ..
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:
Eine nicht besetzte Referenz (d. H., Die keine Zurückbehaltungszählung darstellt).
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.)
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
Oder ändern Sie __weak
in __unsafeunretained
. Dies löst das Problem in der Tradition. Da MRC (vor xCode 4 -) __weak nicht in iOS war.