Runtime应用--动态添加方法

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

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

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

#import <Foundation/Foundation.h>

@interface HTModel : NSObject

@end

在.m文件中

#import "HTModel.h"
#import <objc/message.h>

@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]  调用了方法<HTModel: 0x60800001d3d0>, printObj

总结:

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容