mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
69 lines
2.7 KiB
Objective-C
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
|