2016-10-11 6 views
2

제 3 자 프레임 워크가있는 매우 큰 프로젝트를 가지고 있으며 제 3 자 프레임 워크가 기본 예상 동작을 망치지 않도록 메소드 스위 즐링을 비활성화하려고합니다. 가능합니까? 프로젝트 설정에 플래그가 있습니까?신속한 프로젝트에서 메서드 swizzling을 비활성화 할 수 있습니까?

+0

클래스가 NSObject에서 상속하는 경우이를 수행 할 방법이 없습니다. 모든 UIKit 클래스는 기본적으로 NSObject에서 상속됩니다. 자신의 프로젝트에서 정의한 클래스의 경우 NSObject에서 상속하지 않아야하며,이 조건에서만 swizzling이 작동하지 않습니다. –

+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!)

을 핵심 메소드를 오버라이드 (override) 할 수 있습니다 스위 즐링에서 모든 도서관을 방지하려면 난 몰라 그래도,하지만 당신은 그것을 시도 줄 수 제안했다.

+0

매우 흥미 롭습니다. 방금 나에게 일어났습니다. 시스템의 라이브러리 (Foundation, UIKit 등) 중 어느 것도 현재 구현시에 swizzling을 사용하고 솔루션을 적용해도 아무 것도 깨지지 않을 것이라고 확신합니까? 애플에 의해 어리석은 움직임이 될 것이다. (결국, 그들은 코드를 소유하고있다 : 해킹에 반복되는 대신에 필요한 부분을 다시 쓸 수 있지만 ...). –

+1

어렴풋이 위험하다. UIKit 사과 같은 프레임 워크는 그것을 사용하지 않거나 공개되지 않은 내부 스위 즐링 기능을 가지고있을 수 있습니다 (hehh을 ​​전제로하지 않음). 필자는 항상 swizzling에 의존하기 때문에 실제 프로젝트에서는 시도하지 않았지만, (또는 누구든지) 시도해보고 결과를 작성하면 좋을 것입니다. –

+0

나는 그 길이에 가지 않을 것이다 :) 나는 그것을 막을 깃발이 있는지 알고 싶었고 그런 깃발이 없다는 나의 가정을 확인했다. 고맙습니다. –