2016-10-11 1 views
2

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?

+0

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. –

+0

bekommen Hilfe von ihm. https://github.com/uraimo/SwizzlingInSwift –

Antwort

1

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.

+0

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 ... –

+1

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. –

+0

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 –

Verwandte Themen