Runtime应用--动态添加方法

在面试中可能会被问到:是否使用过performSelector这个方法?
这个问题其实就是考察Runtime的动态添加方法, 其执行的效果其实和发送信息是等价的。performSelector允许发送在允许时才确定的消息,即只要这个消息能够被转发到正确的接收者,能够被最后的接收者识别,就可以正确运行。

  • 使用performSelector这个方法,是将方法写在.m文件中,而不需要在.h文件中申明。如果在.h文件中申明了,那么调用performSelector和直接调用方法并没有什么不同。
  • 如果在.h中不申明,直接调用时会立马报错。而performSelector调用时并不会立马报错。

performSelector 使用代码如下:
创建一个类HTModel, 在.h文件中不申明方法。

#import 

@interface HTModel : NSObject

@end

在.m文件中

#import "HTModel.h"
#import 

@implementation HTModel

void printObj(id self, SEL _cmd)
{
    NSLog(@" 调用了方法%@, %@",self,
          NSStringFromSelector(_cmd));
}
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(printObj))
    {
        class_addMethod(self, sel, (IMP)printObj, "V@:");
        return YES;
    }
    return  [super resolveClassMethod:sel];
}

@end

我们测试下

- (void)viewDidLoad {
    [super viewDidLoad];
    HTModel *model = [[HTModel alloc] init];
    [model performSelector:@selector(printObj)];
}

打印如下:

2017-06-29 11:06:09.372 动态添加方法[14735:470054]  调用了方法, printObj

总结:

  1. 需要注意performSelector和直接调用的区别;
  1. performSelector动态添加方法套路是固定地,不需要过多关心为什么这样写,因为官方例子就是这样写的。

上传代码到gitHub, 如果你喜欢我的文章,记得star,给予我继续写作的动力。

你可能感兴趣的:(Runtime应用--动态添加方法)