OC中的消息机制可概括为三步:
- 消息发送。
- 动态解析。
- 消息转发。
由于消息机制objc_msgSend()方法调用非常频繁,所以OC底层中是使用汇编和C来实现,提高了运行的效率。但是在某种情况下,比如:需要持续大量重复调用某方法的极端情况;我们也可以避开消息发送泛滥而直接调用该方法,这样会更高效。当然这种情况非常少见。
简单声明一个Person
类:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
随便写个方法:
Person *object1 = [[Person alloc] init];
void (*setName)(id,SEL,NSString*);
// setName = (void(*)(id,SEL,NSString*))[object1 methodForSelector:@selector(setName:)];
// 或者
setName = (void(*)(id,SEL,NSString*))class_getMethodImplementation([Person class], @selector(setName:));
setName(object1,@selector(setName:),@"避开消息转发");
NSLog(@"object1.name:%@",object1.name);
打印结果:
2018-06-08 11:06:03.003656+0800 Test[9158:1274903] object1.name:避开消息转发
可以看到方法调用成功,这样就比来了OC的消息机制,直接通过内存地址去调用方法。