두 가지 swizzling 방법에는 약간의 차이가 있습니다.이 두 메커니즘 사이를 swizzling 할 때의 차이점
@implementation UIView (SwizzleFirstWay)
+ (void)load {
SEL originalSelector = @selector(viewDidLoad);
SEL swizzledSelector = @selector(swizzled_viewDidLoad);
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);
class_addMethod(self,
originalSelector,
class_getMethodImplementation(self, originalSelector),
method_getTypeEncoding(originalMethod));
// Adding the method
class_addMethod(self,
swizzledSelector,
class_getMethodImplementation(self, swizzledSelector),
method_getTypeEncoding(swizzledMethod));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
+ (void)swizzled_viewDidLoad {
// ... the swizzled implementation
// ...
// ...
[self swizzled_viewDidLoad]; // calling back to the original implementation
}
@end
두 번째 방법 (class_addMethod
을 사용하지 않고) : 근본적으로 다른 나 (class_addMethod
를 사용하여) 우리가 UIView
첫 번째 방법에 viewDidLoad
를 스위 즐링하는 가정
그들 사이에 뭔가 문제가있는 경우 그냥 설명을 원한다 :
+ (void)load {
SEL originalSelector = @selector(viewDidLoad);
SEL swizzledSelector = @selector(swizzled_viewDidLoad);
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);
// NOT USING class_addMethod
method_exchangeImplementations(originalMethod, swizzledMethod);
}
+ (void)swizzled_viewDidLoad {
// ... the swizzled implementation
// ...
// ...
[self swizzled_viewDidLoad]; // calling back to the original implementation
}
@end
코드가 작동합니까? 선택기 swizzled_viewDidLoad에 대해 class_getInstanceMethod를 호출하지만 해당 함수는 인스턴스 메소드가 아닌 클래스 메소드입니다. –