Es gibt eine leichte Abweichung zwischen diesen beiden Arten des Swizzlings. Ich will nur, Klärung, ob es etwas grundlegend anders oder falsch zwischen ihnen istWas ist der Unterschied beim Swizzling zwischen diesen beiden Mechanismen?
Angenommen, wir viewDidLoad
auf UIView
Ersten Weg sind Swizzling (mit class_addMethod
):
@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
Zweitem Weg (ohne class_addMethod
) :
+ (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
Funktioniert Ihr Code? Sie rufen class_getInstanceMethod für selector swizzled_viewDidLoad auf, aber diese Funktion ist Klassenmethode, nicht Instanzmethode. –