Files
NativeScript/packages/ui-mobile-base/ios/TNSWidgets/TNSWidgets/NSObject+Swizzling.m

69 lines
2.7 KiB
Objective-C

//
// NSObject+Swizzling.m
// TNSWidgets
//
// Created by Manol Donev on 21.08.18.
// Copyright © 2018 Telerik A D. All rights reserved.
//
#import "NSObject+Swizzling.h"
@implementation NSObject (Swizzling)
#pragma mark - Method Swizzling
+ (void)swizzleInstanceMethodWithOriginalSelector:(SEL)originalSelector
fromClass:(Class)classContainigOriginalSel
withSwizzlingSelector:(SEL)swizzlingSelector {
Method originalMethod = class_getInstanceMethod(classContainigOriginalSel, originalSelector);
Method swizzlingMethod = class_getInstanceMethod(self.class, swizzlingSelector);
[self swizzleMethodWithOriginalSelector:originalSelector
originalMethod:originalMethod
fromClass:classContainigOriginalSel
withSwizzlingSelector:swizzlingSelector
swizzlingMethod:swizzlingMethod];
}
//MARK: Utilities
+ (void)swizzleMethodWithOriginalSelector:(SEL)originalSelector
originalMethod:(Method)originalMethod
fromClass:(Class)classContainigOriginalSel
withSwizzlingSelector:(SEL)swizzlingSelector
swizzlingMethod:(Method)swizzlingMethod {
if (self == classContainigOriginalSel) {
BOOL didAddMethod = class_addMethod(classContainigOriginalSel,
originalSelector,
method_getImplementation(swizzlingMethod),
method_getTypeEncoding(swizzlingMethod));
if (didAddMethod) {
class_replaceMethod(self.class,
swizzlingSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzlingMethod);
}
return;
}
class_addMethod(classContainigOriginalSel,
swizzlingSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
class_replaceMethod(classContainigOriginalSel,
originalSelector,
method_getImplementation(swizzlingMethod),
method_getTypeEncoding(swizzlingMethod));
class_replaceMethod(self,
swizzlingSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
}
@end