Ich habe ein sehr großes Projekt mit 3rd-Party-Frameworks und möchte das Swizzling von Methoden deaktivieren, um sicherzustellen, dass die 3rd-Party-Frameworks das standardmäßig erwartete Verhalten nicht durcheinander bringen. Ist es möglich? Gibt es ein Flag in den Projekteinstellungen?Kann das Swizzling von Methoden in einem schnellen Projekt deaktiviert werden?
Antwort
Es gibt keine Option, das zu deaktivieren, obwohl, wenn Sie Unterklassen von NSObject vermeiden, Sie sicher wären. Wenn Sie jede Bibliothek von Swizzling Sie können außer Kraft setzen, die Kernmethoden für sie nämlich
public func class_addMethod(_ cls: Swift.AnyClass!, _ name: Selector!, _ imp: IMP!, _ types: UnsafePointer<Int8>!) -> Bool
und
public func method_exchangeImplementations(_ m1: Method!, _ m2: Method!)
Gefällt Ihnen dieses
public func method_exchangeImplementations(_ m1: Method!, _ m2: Method!) {
}
public func class_addMethod(_ cls: Swift.AnyClass!, _ name: Selector!, _ imp: IMP!, _ types: UnsafePointer<Int8>!) -> Bool
{
return false
}
verhindern wollen kann ich nicht schlage das vor, aber du könntest es versuchen.
Sehr interessant. Es ist mir nur in den Sinn gekommen: Sind wir sicher, dass keine der Systembibliotheken (Foundation, UIKit usw.) darauf angewiesen sind, in ihren aktuellen Implementierungen zu swizzeln, und die Anwendung Ihrer Lösung würde nichts zerstören? Es wäre eine schlampige Bewegung von Apple (schließlich besitzen sie den Code: die Dose kann jeden Teil neu schreiben, den sie brauchen, anstatt sich zu solchen Hacks zu wiederholen ...), kann aber nie sicher sein ... –
Swizzling ist gefährlich und wahrscheinlich in Frameworks wie UIKit Apple werden es nicht verwenden oder vielleicht haben sie ihre internen Swizzling-Funktionen, die nicht öffentlich sind (keine Annahmen hehh). Ich habe es nicht im realen Projekt versucht, da ich mich immer auf swizzling verlasse, aber es wäre toll, wenn du (oder irgendjemand) es versuchen würdest und die Ergebnisse schreibst. –
Ich werde nicht zu dieser Länge gehen :) Ich wollte nur wissen, ob es eine Flagge gibt, um es zu deaktivieren, und Sie bestätigten meine Annahme, dass es keine solche Flagge gibt. Danke –
- 1. Wie kann das Scrollen in einem WKWebView vollständig deaktiviert werden?
- 2. Mit Xcode8 mit einem schnellen 2.3-Projekt, das Cocoapods verwendet
- 3. Sinch Integration in einem schnellen Projekt
- 4. Kann das Dialogfeld "Anwendungsfehler" deaktiviert werden?
- 5. Wie kann das Scrollen von AppBarLayout in CoordinatorLayout deaktiviert werden?
- 6. Wie kann die automatische Vervollständigung auf einem Samsung-Smartphone (Android) in einem Cordova-Projekt deaktiviert werden?
- 7. Wie kann das Caching deaktiviert werden?
- 8. Kann Autocomplete deaktiviert werden?
- 9. Methode Swizzling in Swift
- 10. Wie kann das Zwischenspeichern von Django REST Framework deaktiviert werden?
- 11. Wie kann das Auffüllen von TextInputLayout deaktiviert werden?
- 12. Methode Swizzling in Swift 3.1
- 13. Wie kann das Scrollen in mobilen Browsern deaktiviert werden?
- 14. Super Methoden Unterklasse Typ in schnellen
- 15. Wie kann die Hardwarebeschleunigung in einem SurfaceView deaktiviert werden?
- 16. Mit dispatch_once in Methode Swizzling
- 17. Die automatische Klammerung von Methoden-Klammern in Eclipse kann nicht deaktiviert werden
- 18. Modul kompiliert mit schnellen 4.0 kann nicht in schnellen 3,1
- 19. Wie kann das automatische Laden in NHibernate deaktiviert werden?
- 20. Wie kann das Anti-Aliasing in VisualStudio-Code deaktiviert werden?
- 21. Wie kann die Auswahl in einem DataGridView deaktiviert werden?
- 22. Swizzling Methoden, die implizit ein beibehaltene Objekt unter ARC
- 23. Kann die Wartezeit beim Ziehen in einem UIScrollView deaktiviert werden?
- 24. Kann die Rechtschreibprüfung in einem Textfeld über JavaScript deaktiviert werden?
- 25. Wie objektiv c Header-Datei in einem schnellen Projekt
- 26. Kann die Hintergrundüberblendung von CATransition deaktiviert werden?
- 27. Benutzeranmeldung in Grafana kann nicht deaktiviert werden
- 28. Wie kann in UCM eine Baseline von einem Projekt zu einem anderen Projekt übertragen werden?
- 29. Methode swizzling für "alloc"?
- 30. CodeIgniter: Wie kann das Caching global deaktiviert werden?
Es gibt keine Möglichkeit, dies zu tun, wenn Ihre Klasse von NSObject erbt. Alle UIKit-Klassen werden grundsätzlich von NSObject geerbt. Für die Klassen, die Sie in Ihrem eigenen Projekt definieren, sollte es nicht von NSObject erben, nur in diesem Zustand funktioniert Swizzling nicht. –
bekommen Hilfe von ihm. https://github.com/uraimo/SwizzlingInSwift –