通過#import <objc/runtime.h>我們可以找到: 1 /** 2 * Returns a specified instance method for a given class. 3 * 4 * @param cls The class you want to inspect. 5 ...
通過#import <objc/runtime.h>我們可以找到:
1 /** 2 * Returns a specified instance method for a given class. 3 * 4 * @param cls The class you want to inspect. 5 * @param name The selector of the method you want to retrieve. 6 * 7 * @return The method that corresponds to the implementation of the selector specified by 8 * \e name for the class specified by \e cls, or \c NULL if the specified class or its 9 * superclasses do not contain an instance method with the specified selector. 10 * 11 * @note This function searches superclasses for implementations, whereas \c class_copyMethodList does not. 12 */ 13 OBJC_EXPORT Method _Nullable 14 class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name) 15 OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
class_getInstanceMethod這個可以獲取類的實例方法
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface RuntimeObjc : NSObject -(void)runEg; -(void)otherRunEg; @end
#import "RuntimeObjc.h" #import <objc/runtime.h> @implementation RuntimeObjc +(void)load{ Method runEg = class_getInstanceMethod(self, @selector(runEg)); Method otherRunEg = class_getInstanceMethod(self, @selector(otherRunEg));
//交換 method_exchangeImplementations(runEg, otherRunEg); } -(void)runEg{ NSLog(@"runEg"); } -(void)otherRunEg{
NSLog(@"otherRunEg");
[self otherRunEg];//已經做了置換 故調用的runEg
}
@end
調用
RuntimeObjc * objc = [[RuntimeObjc alloc]init]; [objc runEg];
列印:
2020-05-21 15:42:43.416766+0800 11111[35733:176260] otherRunEg 2020-05-21 15:42:43.416928+0800 11111[35733:176260] runEg