나는 swisszling 메서드를 사용하고 있는데 method_exchangeImplementations
을 수행 한 후에 원래 함수를 호출하고 싶습니다. 나는 이것을 위해 두 가지 프로젝트를 준비했다.swizzled 함수에서 원래 함수 호출하기
첫 번째 프로젝트는 응용 프로그램의 기본 프로젝트입니다. 이 프로젝트에는 응용 프로그램의 모든 논리가 포함됩니다. 뷰가로드 될 때 originalMethodName
이 호출됩니다.
두 번째 프로젝트에는 스위 즐링 코드 만 포함됩니다. 난 originalMethodName
함수와 함께 주 응용 프로그램에 주입하려는 코드가 포함 된 swizzle_originalMethodName
메서드가 있습니다.
@implementation swizzle_ViewController
- (void)swizzle_originalMethodName
{
NSLog(@"FAKE %s", __func__);
}
__attribute__((constructor)) static void initializer(void)
{
NSLog(@"FAKE %s", __func__);
Class c1 = objc_getClass("ViewController");
Class c2 = [swizzle_ViewController class];
Method m1 = class_getInstanceMethod(c1, @selector(originalMethodName));
Method m2 = class_getInstanceMethod(c2, @selector(swizzle_originalMethodName));
method_exchangeImplementations(m1, m2);
}
@end
스위 즐 (아래 출력에서 볼 수 있듯이) 잘 작동하지만, 지금은 내가 NSInvocation
를 사용하려고 한 swizzle_originalMethodName
2016-08-17 14:18:51.765 testMacOS[7295:1297055] FAKE initializer
2016-08-17 14:18:51.822 testMacOS[7295:1297055] REAL -[ViewController viewDidLoad]
2016-08-17 14:18:51.822 testMacOS[7295:1297055] FAKE -[swizzle_ViewController swizzle_originalMethodName]
에서 originalMethodName
를 호출 할 수 싶지만입니다 운이 없다. 내가 뭘 잘못하고 있는거야?
Class c1 = objc_getClass("ViewController");
Method m1 = class_getInstanceMethod(c1, @selector(originalMethodName));
NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:method_getTypeEncoding( m1)];
NSInvocation *originalInvocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[originalInvocation invoke];
'[self swizzle_originalMethodName];을 (를) 호출하는 것은 어떻습니까? 그 선택자는 교환 후에 원래의 구현으로 되돌아 가야한다. –
이것은 천재입니다. 왜 이것이 나에게 일어나지 않았는지 모르겠습니다. 그래도 여전히 오류가 발생하고 해결 방법을 모르겠습니다. '- [ViewController swizzle_originalMethodName] : 인식 할 수없는 셀렉터가 인스턴스로 전송되었습니다. 0x7ff72974a670' –
아, 맞아 ... 당신은 다른 클래스를 뒤 흔드는 군. 나는 그것에 대해 생각할 필요가있을 것이다. –