在面试中可能会被问到:是否使用过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
总结:
- 需要注意performSelector和直接调用的区别;
- performSelector动态添加方法套路是固定地,不需要过多关心为什么这样写,因为官方例子就是这样写的。
上传代码到gitHub, 如果你喜欢我的文章,记得star,给予我继续写作的动力。