OC中的消息機(jī)制可概括為三步:
- 消息發(fā)送。
- 動(dòng)態(tài)解析鳄乏。
- 消息轉(zhuǎn)發(fā)跷车。
由于消息機(jī)制objc_msgSend()方法調(diào)用非常頻繁,所以O(shè)C底層中是使用匯編和C來(lái)實(shí)現(xiàn)橱野,提高了運(yùn)行的效率朽缴。但是在某種情況下,比如:需要持續(xù)大量重復(fù)調(diào)用某方法的極端情況水援;我們也可以避開(kāi)消息發(fā)送泛濫而直接調(diào)用該方法密强,這樣會(huì)更高效。當(dāng)然這種情況非常少見(jiàn)蜗元。
簡(jiǎn)單聲明一個(gè)Person
類:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
隨便寫(xiě)個(gè)方法:
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:),@"避開(kāi)消息轉(zhuǎn)發(fā)");
NSLog(@"object1.name:%@",object1.name);
打印結(jié)果:
2018-06-08 11:06:03.003656+0800 Test[9158:1274903] object1.name:避開(kāi)消息轉(zhuǎn)發(fā)
可以看到方法調(diào)用成功或渤,這樣就比來(lái)了OC的消息機(jī)制,直接通過(guò)內(nèi)存地址去調(diào)用方法奕扣。