分享

iOS开发Runtime 方法替换

 精品唯居 2021-12-24

通过#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

 





 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多