OC中如何避开消息机制

OC中的消息机制可概括为三步:

  1. 消息发送。
  2. 动态解析。
  3. 消息转发。

由于消息机制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的消息机制,直接通过内存地址去调用方法。

你可能感兴趣的:(OC中如何避开消息机制)