2016-10-11 15 views
2

私はサードパーティ製のフレームワークを持つ非常に大きなプロジェクトを持っており、サードパーティ製のフレームワークがデフォルトの予想される動作を乱していないことを確認するためにメソッドのスウィズルを無効にしたいと考えています。 可能ですか?プロジェクト設定にいくつかの旗がありますか?迅速なプロジェクトでメソッドスウィズルを無効にすることはできますか?

+0

あなたのクラスがNSObjectから継承する場合、これを行う方法はありません。すべてのUIKitクラスは、基本的にNSObjectから継承されます。あなた自身のプロジェクトで定義したクラスについては、NSObjectから継承するべきではありません。この条件でのみ、スウィズルが機能しません。 –

+0

助けを得てください。 https://github.com/uraimo/SwizzlingInSwift –

答えて

1

これを無効にするオプションはありませんが、NSObjectからサブクラス化することを避けると安全です。あなたはこの

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 
} 

のようにそれのために、すなわち

public func class_addMethod(_ cls: Swift.AnyClass!, _ name: Selector!, _ imp: IMP!, _ types: UnsafePointer<Int8>!) -> Bool

public func method_exchangeImplementations(_ m1: Method!, _ m2: Method!)

をコアメソッドをオーバーライドすることスウィズルから任意のライブラリを防ぎたい場合は 私にはありませんあなたがそれを試してみるかもしれないと示唆しています。

+0

非常に興味深い。システムのライブラリ(Foundation、UIKitなど)のどれも現在の実装でうねりに頼っていないと確信していますか?それはAppleの厄介な動きだろう(結局のところ、彼らはコードを所有している:そのようなハッキングに繰り返されるのではなく、必要な部分を書き直すことができる...)。しかし、決して確実にすることはできない。 –

+1

Swizzlingは危険でおそらくUIKitりんごのようなフレームワークはそれを使用しません。あるいは、おそらく彼らは公開されていない内部的なスウィズル機能を持​​っています(hehhという仮定はありません)。 私はいつもスウィズルに頼っているので、実際のプロジェクトでそれを試してみませんでしたが、あなた(または誰か)が試して結果を書いてくれれば素晴らしいでしょう。 –

+0

私はその長さに行かない:)私はそれを無効にするフラグがあるかどうかを知りたかったので、そのようなフラグがないという私の前提を確認した。ありがとうございました –

関連する問題